Spring声明式事务配置问题以及事务不回滚问题

一、声明式事务配置问题

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 异常都不会引起事务回滚;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值