Spring事务参数Propagation(传播性)

15 篇文章 0 订阅
10 篇文章 0 订阅

使用方法:

@Override
@Transactional(rollbackFor = Exception.class,propagation = Propagation.NOT_SUPPORTED)
public List<StockComponentHead> batchUpdate(List<StockComponentHead> list, String... optionals) {
    return this.batchUpdateOptional(list, optionals);
}

一、传播级别

1、REQUIRED

这个是事务的默认取值,当ServiceA.methodA的事务级别是REQUIRED,ServiceB.methodB也是REQUIRED时,ServiceA.methodA起了一个事务,ServiceB.methodB被ServiceA.methodA调用,发现自己在事务中,就不再起事务了,如果ServiceA.methodA没有起事务,则ServiceB.methodB自己起事务。

当前存在事务中则加入当前事务,如果不在事务中则起一个新事务。

2、REQUIRES_NEW

当ServiceA.methodA的事务级别是REQUIRED,ServiceB.methodB也是REQUIRES_NEW时,ServiceA.methodA起了一个事务,ServiceB.methodB被ServiceA.methodA调用,则挂起ServiceA.methodA的事务,自己重新起事务,这两个事务是隔离的,当ServiceB.methodB提交后,才继续ServiceA.methodA的事务。它与REQUIRED的事务区别在于事务的回滚程度,因为ServiceB.methodB是新起一个事务,那么就是存在两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,它抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可以提交。

重新起事务,不管当前是否存在事务中,存在则挂起当前事务,重起事务,提交后继续完成被挂起的事务。事务相互隔离,回滚失败与否互不影响,但是抛出的异常外层事务是可以捕获的。

3、SUPPORTS

当标注的方法在事务中,则按事务的方式执行,此时类似标注REQUIRED,外层回滚一起回滚,其本身并不会发起事务,当外层没有事务,则按没有事务的方式执行。

如果当前在事务中,即以事务的形式运行,如果当前不在一个事务中,那么就以非事务的形式运行

4、NOT_SUPPORTED

当标注的方法在事务中,则按没有事务的方式执行,此时会挂起外层的事务,执行完后继续完成被挂起的事务,情况类似REQUIRES_NEW,都是隔离的,但是标注NOT_SUPPORTED是没有在事务中的,操作失败也不会回滚,但是异常能被外层事务捕获。

隔离外层事务,且本身不起事务,当外层有事务则挂起外层事务,执行完自己的方法后继续完成被挂起的事务,外层回滚不影响自身操作,但是抛出的异常外层事务是可以捕获的。

5、MANDATORY

必须在一个事务中运行。也就是说,只能被一个父事务调用。否则,就要抛出异常。

6、NEVER

当ServiceA.methodA的事务级别是REQUIRED,ServiceB.methodB也是NEVER时,ServiceA.methodA起了一个事务,ServiceB.methodB被ServiceA.methodA调用,ServiceB.methodB就会抛出异常

不能在事务中运行。否则,自身就会抛出异常。

7、NESTED

这个级别和REQUIRES_NEW理解基本一样,不同在于NESTED不是重新起一个事务,而是建一个savepoint,提交时间要和外层事务一起提交,一起回滚,但是有一个好处在于它存在一个savepoint。例如自身回滚失败,外层可以选择新分支执行并尝试完成自己的事务。

开始一个 “嵌套的” 事务, 它是已经存在事务的一个真正的子事务. 嵌套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 嵌套事务是外部事务的一部分, 只有外部事务结束后它才会被提交.

二、嵌套事务对比

下面主要区分REQUIREDREQUIRES_NEWNESTED 的区别:

假设方法A用REQUIRED修饰,方法B用下面的级别修饰,A方法调用B方法会出现什么情况

方法情况REQUIRES_NEWNESTEDREQUIRED
事务理解两个独立事务B的事务嵌套在A的事务中同一个事务
A正常、B正常B先提交,A再提交A和B一起提交A和B一起提交
A正常、B异常1、B先回滚,A捕获异常,则A再提交
2、B先回滚,A未捕获异常,则A再回滚
B先回滚,A再提交A和B一起回滚
A异常、B正常B先提交,A再回滚A和B一起回滚A和B一起回滚
A异常、B异常B先回滚,A再回滚A和B一起回滚A和B一起回滚
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值