Spring事务的传播机制

Spring事务的传播机制

一、什么是事务传播行为

事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。

用伪代码说明:

public void methodA(){
    methodB();
    //doSomething
 }

 @Transaction(Propagation=XXX)
 public void methodB(){
    //doSomething
 }

代码中methodA()方法嵌套调用了methodB()方法,methodB()的事务传播行为由@Transaction(Propagation=XXX)设置决定。这里需要注意的是methodA()并没有开启事务,某一个事务传播行为修饰的方法并不是必须要在开启事务的外围方法中调用。

二、7种事务传播机制

事务传播行为类型说明
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

1、REQUIRED:

spring默认事务,如果当前没有事务就创建一个事务,如果当前有事务就当入该事务。如果此时B设置为REQUIRED,A调用B后B中的代码会加入A中的事务,一起回滚或提交。

2、SUPPORTS:

有事务就按有事务执行,没有事务就以非事务方式执行。如果此时B设置为SUPPORTS,单独调用B会以非事务的方式执行,A调用B是,B中的代码会加入A中的事务。

3、MANDATORY:

必须要有事务,如果没有事务就会报错。如果B设置为MANDATORY,单独调用B会报错,A调用B时,B中的代码会加入A中的事务,一起回滚或提交。

4、REQUIRES_NEW:

不管有没有事务都会创建一个新的事务。如果B设置为REQUIRES_NEW,单独调用B会创建事务,A调用B时,B也会创建一个新事务t2,A事务t1和t2互不影响,各自提交回滚自己的事务。

5、NOT_SUPPORTED:

不支持事务,如果有事务就会把事务挂起。如果B设置为NOT_SUPPORTED,单独调用B没有事务,A调用B时,运行到B中代码时,会把事务挂去。

6、NEVER:

不支持事务,如果有事务就会报错。如果B设置为NEVER,单独调用B没有事务,A调用B时会报错。

7、NESTED:

嵌套事务,当前有事务时就嵌套执行事务,当前没有事务时就按REQUIRED属性执行。如果B设置为NESTED,单独调用B会创建一个事务。A调用B时,B会创建一个回滚点,B中代码

抛出异常时会回滚到这个回滚点,A中的代码可以继续往下执行,但是A中代码出异常后会连带着B一起回滚。

关于NESTED嵌套事务:
主事务和嵌套事务属于同一个事务
嵌套事务出错回滚不会影响到主事务
主事务回滚会将嵌套事务一起回滚了

今天的分享就到此结束了

欢迎点赞评论互关三连

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ninghes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值