![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3525433-21.jpg)
文章插图
3.5 NEVER不支持事务
当外层方法A开启了事务 , 方法B抛出异常
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3521249-22.jpg)
文章插图
例子:
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3522623-23.jpg)
文章插图
以上代码,两个方法都打上了事务注解 , 方法A的传播性是REQUIRED,方法B的传播性是NEVER 。
具体执行过程:
- 方法A开启事务,执行insert,没有提交 。
- 含有事务的方法A调用方法B,方法B的传播性是NEVER,表示不支持事务,因此方法B抛出异常 。
- 方法A的事务执行回滚 。
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3521216-24.jpg)
文章插图
3.6 MANDATORY必须在事务中执行 。
如果外层方法A没有开启事务,方法B抛出异常 。
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3522550-25.jpg)
文章插图
如果外层方法A开启了事务,方法B加入事务 , 方法A&B在同一事务中执行 。
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F352EO-26.jpg)
文章插图
例子:
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3525040-27.jpg)
文章插图
以上例子 , 方法A没有加事务注解,方法B 的传播性为 MANDATORY 。
具体执行过程:
- 方法A的调用方如果本身没有开启事务,方法A执行前不会开启事务 。
- 当非事务方法A调用方法B时,由于方法B的传播性为MANDATORY,必须在事务中执行,条件不满足,抛出异常 。
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3523448-28.jpg)
文章插图
3.7 NESTED嵌套事务
- 如果外层方法A不存在事务,内层方法B的规则与REQUIRED 一致 。
- 如果外层方法A存在事务,内层方法B做为外层方法A事务的子事务执行,两个方法是一起提交,但子事务是独立回滚 。
内层方法B抛出异常 , 则会回滚方法B的所有操作,但不影响外层事务方法A 。(方法A需要try-catch子事务,避免异常传递到父层事务)
外层方法A回滚,则内层方法B也会回滚 。 - 该传播性的特点是可以保存状态点,当回滚时 , 只会回滚到某一个状态点,保证了子事务之间的独立性 , 避免嵌套事务的全局回滚 。
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F3525921-29.jpg)
文章插图
例子:
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F35245K-30.jpg)
文章插图
以上例子,方法A的传播性为REQUIRED,方法B为NESTED 。
具体执行过程:
- 方法A执行时,如调用方没有开启事务,则开启一个事务 。
- 方法B被外层方法A调用时,因为方法B的传播性为NESTED,方法B在此处建立savepoint,标记insert行为 。
- 当方法B抛出异常,其insert操作会回滚,但只会回滚到savepoint,(前提是方法A要try-catch方法B,使方法B的异常不会往外传递) 。
- 方法B回滚后,方法A的事务提交 。
![Spring 七种事务传播性介绍](http://img.jiangsulong.com/240104/1F352D13-31.jpg)
文章插图
四、总结本文解释了Spring框架中的事务传播性,即多个业务方法之间调用时事务如何处理的规则 。Spring提供了七种传播级别 , 如
PROPAGATION_REQUIRED、
PROPAGATION_REQUIRES_NEW等 。
每种级别都有适用场景和限制,本文提供了一些示例,介绍了声明式事务如何使用,每种事务的规则,产生哪种行为,当方法抛出异常时,事务的提交和回滚是如何被处理的 。正确处理事务对于任何企业级应用程序都是必要的,了解Spring事务传播性是构建高效、可靠和可扩展应用程序的关键 。
【Spring 七种事务传播性介绍】
推荐阅读
- 炒面筋的家常做法,油面筋最好吃的七种家常做法
- 简易版的SpringBoot是如何实现的!!!
- Spring非常实用的技巧,你确定知道?
- 分布式场景下的事务机制
- SpringBoot中如何优雅地个性化定制Jackson
- 监控 Spring Cloud 微服务的实践方案
- 解析MongoDB的并发控制和事务隔离级别:保证数据一致性
- SpringBoot+虚拟线程,接口吞吐量成倍增加,太爽了!
- springboot-如何集成Validation进行参数校验
- Spring6提供的四种远程接口调用神器!你知道那种?