Spring事务传播行为REQUIRES_NEW和NESTED用法栗子

Posted 做猪呢,最重要的是开森啦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务传播行为REQUIRES_NEW和NESTED用法栗子相关的知识,希望对你有一定的参考价值。

1. Spring事务传播行为propagation:

Spring事务还有7种传播行为(propagation),是为了业务层之间调用事务关系而提出的,数据库层面并存在事务传播行为

  • REQUIRED:默认传播行为,当前有事务,就加入;没有事务就新建一个
  • SUPPORTS:当前有事务,就加入;没有事务就按非事务来调用
  • MANDATORY:当前有事务,就加入;没有事务就抛异常
  • REQUIRES_NEW:无论当前有没有事务,都会新建事务
  • NOT_SUPPORTED:如果当前有事务,事务挂起, 以非事务来执行;当前无事务,也以非事务来执行
  • NEVER:以非事务来执行,如果当前有事务,抛异常
  • NESTED:嵌套事务执行,如果没有事务就按REQUIRED来执行,也就是新建一个事务

2. 举个栗子:

比如常见的主方法不回滚而子方法异常回滚,就是通过传播行为控制的

 注意点:

  • 当子方法传播行为是NESTED时,虽然子方法没有异常,但是主方法异常了,就导致子方法和主方法都回滚,因为子方法嵌套用的主方法的事务
  • 当子方法传播行为是REQUIRED_NEW时,子方法会新建事务,子方法异常就回滚,而主方法catch了异常,所以不会触发主方法事务回滚
  • 主方法要catch异常,避免子方法异常而影响主方法事务回滚,主方法要想回滚就得再抛出运行时异常
  • 子方法不能是自调用,也就是不能在同一个类,和代理有关

以上是关于Spring事务传播行为REQUIRES_NEW和NESTED用法栗子的主要内容,如果未能解决你的问题,请参考以下文章

spring事务传播行为之使用REQUIRES_NEW不回滚

Spring事务中requires_new和嵌套传播的区别

Spring事务的传播

为啥即使在 Spring 服务类的第二个方法中传播 = Propagation.REQUIRES_NEW 时事务也会回滚?

spring事物中的传播及隔离

Spring中声明式事务的几个属性的解释