一、声明式事务配置问题
1、在数据源文件(applicationContext-datasource.xml)中配置
<!-- 事物管理 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 指明使用注解的方式来管理事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
2、并且在你的应用的Service实现层代方法上添加注解 @Transactional
二、事务不回滚问题;
导致事务不回滚的两个原因,一是可能未指明使用注解的方式来管理事务; 二是Service类内部方法调用未添加注解 @Transactional ;
1、Service类内部方法调用未添加注解 @Transactional
大概就是 ServiceImpl 中有一个方法A,会内部调用方法 B, 方法 A没有事务管理,方法 B采用了声明式事务,调用方法A时,B出错,事务未回滚。
由此看来声明式事务是通通过AOP动态代理实现的,这样会产生一个代理类来做事务管理,而目标类(service)本身是不能感知代理类的存在的。
对于加了@Transactional注解的方法来说,在调用代理类的方法时,会先通过拦截器TransactionInterceptor开启事务,然后在调用目标类的方法,最后在调用结束后,TransactionInterceptor 会提交或回滚事务;
2、如何设置开启Spring事务,并且简单有效的控制事务回滚。
指明使用注解的方式来管理事务,应用的Service实现层代方法上添加注解 @Transactional;
在Spring FrameWork 的事务框架中推荐的事务回滚方法是,在当前执行的事务上下文中抛出一个异常。如果异常未被处理,当抛出异常调用堆栈的时候,Spring FrameWork 的事务框架代码将捕获任何未处理的异常,然后并决定是否将此事务标记为回滚。
在默认配置中,Spring FrameWork 的事务框架代码只会将出现runtime, unchecked 异常的事务标记为回滚;也就是说事务中抛出的异常时RuntimeException或者是其子类,这样事务才会回滚(默认情况下Error也会导致事务回滚)。在默认配置的情况下,所有的 checked 异常都不会引起事务回滚;