spring 事务传播级别

一、 介绍

主要就是下面两张图 ,很重要, 很重要,很重要 .能够清晰的描述出 第一次事务,和 嵌套事务的 关系. 记录一下

  1. 当前不存在事务 , 直接调用带有事务的方法, 不存在加入外部事务这么一说, 要么就是 新建事务, 要么就是以非事务的方式运行 ,当然,也可以抛出异常
传播级别运行方式
requires_new新建事务
nested新建事务
required新建事务
supports非事务方式运行
not_supported非事务方式运行
never非事务方式运行
mandatory抛出异常
  1. 间接调用,就是 外部的方法新建了事务, 在这种情况下 (说明外部的事务的传播级别为 requires_new, nested 或者 required ), 当前方法的运行方式如下表示:
传播级别运行方式
requires_new新建事务
nested设置一个 savepoint ,不算是新的事务,单独回滚(排除JTA 情况)
required直接加入到外部事务
supports直接加入到外部事务
not_supported挂起外部事务,以非事务的方式运行
never抛出异常
mandatory直接加入到外部事务

1.2 各种事务的解释

1)PROPAGATION_REQUIRED ,默认的Spring事物传播级别,使用该级别的特点是,如果上下文中已经存在事物,那么就加入到事物中执行,如果当前上下文不存在事物,则新建事物执行。所以这个级别的事物传播别介通常能满足大多数的业务场景。

2)PROPAGATION_SUPPORTS ,从字面意思就知道,supports 支持,该传播级别的特点是,如果上下文存在事物,则支持事物加入,如果没有事物,则使用非事物的方式执行。所以并非所有的包在transactionTemplate.execute中的代码都会有事物支持。这个传播级别通常是用来处理那些并非原子性的非核心业务逻辑操作。应用场景较少。

3)PROPAGATION_MANDATORY ,该级别的事物要求上下文中必须要存在事物,否则就会抛出异常!配置该方式的传播级别是有效的控制上下文调用代码遗漏事物控制的保证手段。比如一段代码不能单独被执行调用,但是一旦被调用,就必须有事物包含的情况,就可以使用这个传播级别。

4)PROPAGATION_REQUIRES_NEW ,从字面即可知道,new 每一次都要一个新事物,该传播级别的特点是,每次都会新建事物,并且上下文的事物挂机,执行当前新建事物完成以后,上下文事物回复再执行。
这是一个很有用的传播级别,比如:现在有一个发送100个红包的操作,在发送之前,要做一些系统的初始化、验证、数据记录操作,然后发送100封红包,然后再记录发送日志,发送日志要求100%的准确,如果日志不准备,整个父事物逻辑需要回滚。
怎么处理整个业务需求?就是通过这个PROPAGATION_REQUIRES_NEW级别的事物传播控制就可以完成。发送红包的子食物不会直接影响到父事物的提交和回滚。

5)PROPAGATION_NOT_SUPPORTED ,这个从字面上可知道,not supported 不支持,当前级别的特点就是上下文中存在事物,则挂起事物,执行当前逻辑,结束后回复上下文的事物。
这个事物传播级别有什么好处?可以帮助你将事物极可能的缩小。我们知道一个事物越大,它存在的风险也就越多。所以在处理事物的过程中,要保证尽可能的缩小范围。比如一段代码,是每次逻辑操作都必须要条用的,比如循环1000次的某个非核心业务逻辑操作。这样的代码如果包在事物中,势必造成事物太大,导致出现一些难以考虑周全的异常情况。所以这个事物这个级别的传播级别就派上用场了。用当前级别的事物包起来就可以了。

6)PROPAGATION_NEVER ,该事物更严格,上面的事物传播级别只是不支持,有事物就挂起,而NEVER传播级别要求上下文中不能存在事物,一旦有事物,就抛出runtime异常,强制停止执行!这个事物传播级别可以说跟事物有仇。

7)PROPAGATION_NESTED ,这个从字面可以知道,nested 嵌套级别事物。该传播级别特征是,如果上下文中存在事物,则嵌套事物执行,如果不存在事物,则新建事物。

1.2 什么是嵌套事务?

嵌套事务是子事务套在父事务中执行,子事务是父事务的一部分,在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务,这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。重点就在于那个save point。以下两个问题点说明:
如果子事务回滚,会发生什么?
父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。
如果父事务回滚,会发生什么?
父事务回滚,子事务也会跟着回滚!因为在父事务结束之前,子事务是不会提交的,子事务是父事务的一部分。

支付宝微信
支付宝微信
如果有帮助记得打赏哦特别需要您的打赏哦

【转载】原文出处:spring事务传播级别
【转载】原文出处:Spring事务专题(五)聊聊Spring事务到底是如何实现的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值