spring事务的传播特性

什么是事务的传播特性?
A,B两个方法都有事务,在A方法中去调用B方法,此时事务方法应该如何进行处理。
比如 A方法里面调用B方法。
情况一:A方法出现异常,A方法需要回滚,那么B方法需不需要回滚呢?
情况二:B方法出现异常,B方法需要回滚,那么A方法需不需要回滚呢?
spring总共给出了7种事务隔离级别:
1、PROPAGATION_REQUIRED:默认事务类型,如果没有,就新建一个事务;如果有,就加入当前事务。适合绝大多数情况。
解释:方法A中调用方法B,B方法的事务传播设置为PROPAGATION_REQUIRED,则如果A方法上有事务,B就用A的事务,没有的话,B就自己新建一个事务。
2、PROPAGATION_REQUIRES_NEW:如果没有,就新建一个事务;如果有,就将当前事务挂起。
解释:方法A中调用方法B,B方法的事务传播设置为PROPAGATION_REQUIRES_NEW,则如果A方法上有事务,则将A方法的事务挂起,B用自己的事务。A方法没有事务的话,B自己就新建一个事务。
3、PROPAGATION_NESTED:如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。
解释:方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NESTED,则如果A方法上有事务,则B方法的事务嵌套在A方法事务中。A方法没有事务的话,B自己就新建一个事务。
嵌套导致的结果是 如果A回滚了,会导致B回滚,B回滚,则不会导致A回滚。
4、PROPAGATION_SUPPORTS:如果没有,就以非事务方式执行;如果有,就使用当前事务。
解释:方法A中调用方法B,B方法的事务传播设置为PROPAGATION_SUPPORTS,则如果A方法上有事务,B就用A的事务,没有的话,B就以非事务方式执行。
5、PROPAGATION_NOT_SUPPORTED:如果没有,就以非事务方式执行;如果有,就将当前事务挂起。即无论如何不支持事务。
解释:方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NOT_SUPPORTED,则如果A方法上有事务,则将A方法的事务挂起(因为A,B方法是在同一个线程中执行的)以非事务方式执行,以非事务方式执行。A没有事务,就以非事务方式执行.
6、PROPAGATION_NEVER:如果没有,就以非事务方式执行;如果有,就抛出异常。
解释:方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NEVER,则要求A方法上不能有事务,有的话,就报错。A没有事务,就以非事务方式执行,B始终是以非事务方式执行。
7、PROPAGATION_MANDATORY:如果没有,就抛出异常;如果有,就使用当前事务。
解释:方法A中调用方法B,B方法的事务传播设置为PROPAGATION_MANDATORY,则要求A方法上有事务,有的话,B用A的事务。A没有的话,就报错。

总结
方法B一定不以事务方式执行的有
PROPAGATION_NEVER PROPAGATION_NOT_SUPPORTED
方法B一定以事务方式执行的有
PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW
PROPAGATION_NESTED PROPAGATION_MANDATORY
方法B以事务方式执行或者以不是事务方式执行都行的情况的有
PROPAGATION_NOT_SUPPORTED

想一下如果A方法调用B方法,A方法有事务,B方法没有事务时,会怎么样?
结论:B方法没有事务,那不正好么,B的代码就与A代码一起在A的事务中执行就完事了。
使用中常见的坑
上面中的事务挂起后会导致,此事务中操作的相关表会被锁住。
比如A方法调用B方法,A,B方法中会操作同一个表。
A有事务,B的是PROPAGATION_NOT_SUPPORTED,此时B会导致A的事务挂起,也就是A操作的表会被锁住,此时B再去操作同一张表就会导致出现问题了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值