spring事务的传播级别解析

提示:以下是本篇文章正文内容,下面案例可供参考


事务的传播七种传播级别

前提:A和B两个方法都有事务,方法A当中调用方法B

1. Propagation.REQUIRED:如果有事务则加入,如果没有事务则创建事务
两个方法的事务都是REQUIRED的情况下,B不会创建新的事务,会加到A的事务当中,最后一起提交。

2. Propagation.REQUIRES_NEW:如果当前存在事务,就把当前事务挂起,然后创建一个新的事务
A是REQUIRED,B是REQUIRES_NEW的时候,B会创建一个新的事务,可以独立的提交与回滚,不受A的事务的影响
当A方法出现异常,A事务回滚,不影响B事务的。
当B方法出现异常的时候,AB都会回滚,B先回滚然后A再回滚,如果A方法中try catch捕获异常,不抛出异常的话,则B事务回滚之后,A事务正常提交

3. Propagation.SUPPORTS:支持当前事务如果没有当前事务,就以非事务方法执行
A方法没有事务,则B方法以非事务的方法执
4. Propagation.MANDATORY:使用当前事务,如果没有当前事务,就抛出异常。
A是REQUIRED,B是SUPPORTS的时候,B方法会抛出异常
5. Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前有事务,则挂起
A是REQUIRED,B是NOT_SUPPORTED的时候,B方法会以非事务的方式执行,A的当前事务会挂起
6. Propagation.NEVER:以非事务的方式运行,如果当前有事务,则抛出异常
A是REQUIRED,B是NEVER的时候,B方法会以非事务的方式执行,如果当前有事务,则抛出异常
7. Propagation.NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
A是REQUIRED,B是NESTED的时候,B会在当前事务中创建一个savepoint,此时A和B是同一个事务,B事务相当于在A事务中开了一个分支,最后提交A事务的时候一起提交。
当A方法出现异常,A方法回滚顺带B的分支也回滚
当B方法出现异常的时候,B方法会回退,然后A再做最后回滚,如果A方法中try catch捕获异常,不抛出异常的话,则B事务回退之后,A事务正常提交

savepoint概念:
首先要知道savepoint就是为回退做的,savepoint的个数没有限制,savepoint和虚拟机中快照类似. savepoint是事务中的一点。用于取消部分事务,当结束事务时,会自动的删除该事务中所定义的所有保存点。
REQUIRES_NEW和NESTED的区别:
REQUIRES_NEW: 如果B正常执行,则B中的数据在A提交之前已经完成提交,其他线程已经可见其修改,这就意味着可能有脏数据的产生;同时,如果接下来A的其他逻辑发生了异常,A回滚,但是B已经完成提交,不会回滚了。当然,如果A接下来的逻辑没有相关要求,那就无所谓了
NESTED: 如果B正常执行,此时B中的修改并不会立即提交,而是在A提交时一并提交,如果A下面的逻辑中发生异常,A回滚时,B中的修改也会回滚,就可以避免上述情况的发生


spring aop异常捕获原理:

被拦截的方法需显式抛出异常,并不能经过任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeException的异常,但可以通过配置来捕获特定的异常并回滚。所以spring事务只在发生未被捕获的runtimeException时才回滚
解决方案:
方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值