- 浏览: 21392 次
- 性别:
- 来自: 深圳
最新评论
-
请叫我东哥:
我想问一下,Spinner.js是3.0以上才有的,那2.2+ ...
我的扩展EXT时间控件,可以选择到时分 -
zht520:
不错 实现效果很好
我的扩展EXT时间控件,可以选择到时分 -
wzgl2014:
" 如果不以接口形式,运行时会出现类型转换错误 ...
Spring的事务管理 -
xiaoyayaday:
css 呢?
我的扩展EXT时间控件,可以选择到时分 -
bardo:
建议看看这一个
http://bardo.iteye.com ...
人民币转成大写
最近因为项目开发,用到Spring事务管理,在网上查了很多资料,总是零零散散,说得都不太全,结果让我试了很多方法,用了好几天才解决。
这里总结一下希望给用到的人有些帮助。
Spring的事务管理,要从以下几个方面都满足条件才能实现异常时事务回滚:
1、数据库事务支持。
2、Spring事务配置正确。
3、软件代码正确。
以下分别说明:
1、数据库事务支持
如果是Oracle数据库,默认都是支持事务的,不多说。很多开发用的是mysql,用mysql的话要使用innerDB和DBD模式,MyISam不支持事务。mysql默认的是MyISam 这种类型的表是没有事务的.所以不管spring如何配置,对此表事务无效.正确做法是改为innerDB。
在建表语句中加上 “engine=INNODB”即可建成innerDB模式的表:
CREATE TABLE parent(
id INT NOT NULL,
PRIMARY KEY (id)
)engine=INNODB;
其它数据库我不太了解,可以去网上查一下。
2、Spring事务配置正确。
这是网上能找到很多答案的地方,也很容易糊涂。网上搜一下,会找到很多。
但要分清处,是Spring + hibernate,还是 Spring+ibatis。
http://jiake.iteye.com/blog/599418
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个Bean都有一个代理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置DAO -->
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 配置事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<property name="target" ref="userDaoTarget" />
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
第二种方式:所有Bean共享一个代理基类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionBase"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init="true" abstract="true">
<!-- 配置事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 配置DAO -->
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao" parent="transactionBase" >
<property name="target" ref="userDaoTarget" />
</bean>
</beans>
第三种方式:使用拦截器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Dao</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 配置DAO -->
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
第四种方式:使用tx标签配置的拦截器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.bluesky" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="interceptorPointCuts"
expression="execution(* com.bluesky.spring.dao.*.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" />
</aop:config>
</beans>
第五种方式:全注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.bluesky" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
此时在DAO上需加上@Transactional注解,如下:
package com.bluesky.spring.dao;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;
import com.bluesky.spring.domain.User;
@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public List<User> listUsers() {
return this.getSession().createQuery("from User").list();
}
}
3、软件代码正确。
3.1 异常要是RuntimeException异常,事务才会回滚。
只有RuntimeException异常,事务才会回滚(当然,也可以是继承于RuntimeException的异常)。所以,需要你事务方法里面出错时的异常要为RuntimeExcptin异常,或者事务方法里的调用方法是抛出这类异常的。NullPointerException是继承于RuntimeException的异常,也是可以回滚的。
最好的处理方式,就是使自己的业务异常类继承于RuntimeException。然后事务方法类里面的方法,抛出这种业务异常。
3.2 方法的事务注释要正确(对于第五种Spring事务配置)。
这里针对的是第五种Spring事务配置,其它配置不用方法上进行事务注释。
但这里要说一下,事务几种方式,一般选择rep就可以了。
对于只读设置为true还是false;一般来说是只有查询的用true,只要方法中有增,删,改,或是调用别的方法里有增,删,改时,都要用false;
3.3 service 和 Dao 要是 接口形式(对于第四种Spring事务配置)。
如果不以接口形式,运行时会出现类型转换错误。刚开始出现这个错,我不知所措,因为我原来代码是没有问题的,只是修改了一下Spring配置,怎么就出转型错呢。
我不愿意使用这种方式,因为这样一来每个类都要增加接口,增加了很多开发工作量。修改类也要同时修改接口,维护起来也不方便。
总结一个最简单的实现要3点:
1、数据库支持,oracle不用设置,mysql建表脚步要用innerDB和DBD模式:
--菜单表(E_BS_MENU)--
CREATE TABLE IF NOT EXISTS E_BS_MENU
(
FMENUID NUMERIC(20,0) NOT NULL COMMENT '菜单ID',
FNUMBER VARCHAR(4) NOT NULL COMMENT '编码',
FFULLNUMBER VARCHAR(320) NOT NULL COMMENT '全编码',
FNAME VARCHAR(100) NOT NULL COMMENT '菜单名',
FPARENTID NUMERIC(20,0) NOT NULL COMMENT '上级菜单ID',
FROOTID NUMERIC(20,0) NOT NULL COMMENT '根ID',
FLEVEL INT(4) NOT NULL COMMENT '级次',
FISDETAIL INT(1) NOT NULL COMMENT '是否为明细',
....
PRIMARY KEY (FKEY,FLOCALE),
INDEX EX_BS_MENU (FLOCALE,FFULLNUMBER)
) ENGINE=INNODB DEFAULT CHARSET=utf8
COMMENT = '菜单表';
2、spring配置中有如下 tx的配置项:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-lazy-init="true">
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
</beans>
3、调用的代码都在服务器层方法中,(可以再里面去调用别的server方法),方法上面注明Transactional:
如下面注册公司时,同时注册一个用户,并初始化公司的一些数据,如果注册用户或者初始化公司数据失败,不会在数据库中新增公司。
/**
* 注册公司
* 测试事务
* @param company Company
*/
@Transactional(readOnly=false, propagation=Propagation.REQUIRED)
public User regist2(Company company,String userName, String pw,int salt) throws ValidateException {
Assert.notNull(company);
//名称重复校验
validateFieldNotEmpty("name", company.getName());
if(this.findExistByName(company.getName())){
throw new ValidateException("公司名称重复:"+company.getName());
}
//生成COID
company.setCoId(getNextCoID());
//编码设置为COID
company.setNumber(String.valueOf(company.getCoId()));
company.setRegistTime(DateUtilsWs.now());
company.setFee(true);
this.validate(company); // 先做校验
dao.insert(company); // 再做保存
if (LOG.isInfoEnabled()) LOG.info("addNew Company, coid " + company.getCoId() + ", value " + company);
//新增一个用户超级用户,同时也是系统管理员
UserService userService = UserService.getInstance();
User user = new User();
user.setCoId(company.getCoId());
user.setName(userName);
user.setNumber(userName);
user.setPassword(pw);
user.setAdmin(true);
user.setSuperAdmin(true);
user.setDelete(false);
wsmsContext.setUserId(user.getCoId());
wsmsContext.setUserName(userName);
wsmsContext.setUserNumber(userName);
userService.registUser(user, salt);
//写日志
LogService logService = LogService.getInstance();
logService.addLog(OperateObject.company, OperateType.add, company.getNumber(),company.getName(), company.getCoId(), null);
initCompany(company.getCoId());
return user;
}
这里总结一下希望给用到的人有些帮助。
Spring的事务管理,要从以下几个方面都满足条件才能实现异常时事务回滚:
1、数据库事务支持。
2、Spring事务配置正确。
3、软件代码正确。
以下分别说明:
1、数据库事务支持
如果是Oracle数据库,默认都是支持事务的,不多说。很多开发用的是mysql,用mysql的话要使用innerDB和DBD模式,MyISam不支持事务。mysql默认的是MyISam 这种类型的表是没有事务的.所以不管spring如何配置,对此表事务无效.正确做法是改为innerDB。
在建表语句中加上 “engine=INNODB”即可建成innerDB模式的表:
CREATE TABLE parent(
id INT NOT NULL,
PRIMARY KEY (id)
)engine=INNODB;
其它数据库我不太了解,可以去网上查一下。
2、Spring事务配置正确。
这是网上能找到很多答案的地方,也很容易糊涂。网上搜一下,会找到很多。
但要分清处,是Spring + hibernate,还是 Spring+ibatis。
http://jiake.iteye.com/blog/599418
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个Bean都有一个代理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置DAO -->
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 配置事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<property name="target" ref="userDaoTarget" />
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
第二种方式:所有Bean共享一个代理基类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionBase"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init="true" abstract="true">
<!-- 配置事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 配置DAO -->
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao" parent="transactionBase" >
<property name="target" ref="userDaoTarget" />
</bean>
</beans>
第三种方式:使用拦截器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Dao</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 配置DAO -->
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
第四种方式:使用tx标签配置的拦截器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.bluesky" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="interceptorPointCuts"
expression="execution(* com.bluesky.spring.dao.*.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" />
</aop:config>
</beans>
第五种方式:全注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.bluesky" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
此时在DAO上需加上@Transactional注解,如下:
package com.bluesky.spring.dao;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;
import com.bluesky.spring.domain.User;
@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public List<User> listUsers() {
return this.getSession().createQuery("from User").list();
}
}
3、软件代码正确。
3.1 异常要是RuntimeException异常,事务才会回滚。
只有RuntimeException异常,事务才会回滚(当然,也可以是继承于RuntimeException的异常)。所以,需要你事务方法里面出错时的异常要为RuntimeExcptin异常,或者事务方法里的调用方法是抛出这类异常的。NullPointerException是继承于RuntimeException的异常,也是可以回滚的。
最好的处理方式,就是使自己的业务异常类继承于RuntimeException。然后事务方法类里面的方法,抛出这种业务异常。
3.2 方法的事务注释要正确(对于第五种Spring事务配置)。
这里针对的是第五种Spring事务配置,其它配置不用方法上进行事务注释。
但这里要说一下,事务几种方式,一般选择rep就可以了。
对于只读设置为true还是false;一般来说是只有查询的用true,只要方法中有增,删,改,或是调用别的方法里有增,删,改时,都要用false;
3.3 service 和 Dao 要是 接口形式(对于第四种Spring事务配置)。
如果不以接口形式,运行时会出现类型转换错误。刚开始出现这个错,我不知所措,因为我原来代码是没有问题的,只是修改了一下Spring配置,怎么就出转型错呢。
我不愿意使用这种方式,因为这样一来每个类都要增加接口,增加了很多开发工作量。修改类也要同时修改接口,维护起来也不方便。
总结一个最简单的实现要3点:
1、数据库支持,oracle不用设置,mysql建表脚步要用innerDB和DBD模式:
--菜单表(E_BS_MENU)--
CREATE TABLE IF NOT EXISTS E_BS_MENU
(
FMENUID NUMERIC(20,0) NOT NULL COMMENT '菜单ID',
FNUMBER VARCHAR(4) NOT NULL COMMENT '编码',
FFULLNUMBER VARCHAR(320) NOT NULL COMMENT '全编码',
FNAME VARCHAR(100) NOT NULL COMMENT '菜单名',
FPARENTID NUMERIC(20,0) NOT NULL COMMENT '上级菜单ID',
FROOTID NUMERIC(20,0) NOT NULL COMMENT '根ID',
FLEVEL INT(4) NOT NULL COMMENT '级次',
FISDETAIL INT(1) NOT NULL COMMENT '是否为明细',
....
PRIMARY KEY (FKEY,FLOCALE),
INDEX EX_BS_MENU (FLOCALE,FFULLNUMBER)
) ENGINE=INNODB DEFAULT CHARSET=utf8
COMMENT = '菜单表';
2、spring配置中有如下 tx的配置项:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-lazy-init="true">
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
</beans>
3、调用的代码都在服务器层方法中,(可以再里面去调用别的server方法),方法上面注明Transactional:
如下面注册公司时,同时注册一个用户,并初始化公司的一些数据,如果注册用户或者初始化公司数据失败,不会在数据库中新增公司。
/**
* 注册公司
* 测试事务
* @param company Company
*/
@Transactional(readOnly=false, propagation=Propagation.REQUIRED)
public User regist2(Company company,String userName, String pw,int salt) throws ValidateException {
Assert.notNull(company);
//名称重复校验
validateFieldNotEmpty("name", company.getName());
if(this.findExistByName(company.getName())){
throw new ValidateException("公司名称重复:"+company.getName());
}
//生成COID
company.setCoId(getNextCoID());
//编码设置为COID
company.setNumber(String.valueOf(company.getCoId()));
company.setRegistTime(DateUtilsWs.now());
company.setFee(true);
this.validate(company); // 先做校验
dao.insert(company); // 再做保存
if (LOG.isInfoEnabled()) LOG.info("addNew Company, coid " + company.getCoId() + ", value " + company);
//新增一个用户超级用户,同时也是系统管理员
UserService userService = UserService.getInstance();
User user = new User();
user.setCoId(company.getCoId());
user.setName(userName);
user.setNumber(userName);
user.setPassword(pw);
user.setAdmin(true);
user.setSuperAdmin(true);
user.setDelete(false);
wsmsContext.setUserId(user.getCoId());
wsmsContext.setUserName(userName);
wsmsContext.setUserNumber(userName);
userService.registUser(user, salt);
//写日志
LogService logService = LogService.getInstance();
logService.addLog(OperateObject.company, OperateType.add, company.getNumber(),company.getName(), company.getCoId(), null);
initCompany(company.getCoId());
return user;
}
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
### Spring事务管理详解 #### 一、事务管理基础概念 在深入探讨Spring事务管理之前,我们需要先理解什么是事务。事务可以被定义为一系列的操作集合,这些操作作为一个整体被提交或回滚。简单来说,事务就是一个不...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型
Synchronized锁在Spring事务管理下,导致线程不安全。
本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...
本文将详细介绍Spring事务管理的四种方式:编程式事务管理、声明式事务管理、PlatformTransactionManager接口以及TransactionTemplate。 1. **编程式事务管理**:这是一种手动控制事务的方式,通过在代码中调用`...
### Spring事务管理详解 #### 一、Spring事务管理的重要性及必要性 在现代软件开发中,事务管理是一项至关重要的技术,特别是在涉及数据库操作时。事务能够确保一系列操作要么全部成功,要么全部失败,这对于保持...
Spring事务管理是Spring框架的核心特性之一,它提供了一种强大且灵活的方式来管理应用程序中的事务边界。在企业级Java应用中,事务处理是确保数据一致性、完整性和可靠性的关键部分。本篇文章将深入探讨Spring的事务...
总的来说,Spring事务管理提供了一种灵活、强大的方式来处理应用程序中的事务,无论是在简单还是复杂的事务场景下,都能有效保证数据的一致性和完整性。通过声明式事务管理,开发者可以将关注点从事务细节中解脱出来...
Spring事务管理是Spring框架的核心特性之一,它提供了一种在Java应用中管理和协调数据库事务的标准方式。对于有Java基础的开发者来说,理解并掌握Spring事务管理至关重要,因为这有助于确保数据的一致性和完整性,...
当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...
### Spring事务管理的方法 #### 一、引言 在企业级应用开发中,事务管理是一项至关重要的技术。Spring框架作为Java领域中一个非常流行的轻量级框架,为开发者提供了多种方式来实现事务管理,其中主要分为编程式...