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 服务类的第二个方法中传播 = Propagation.REQUIRES_NEW 时事务也会回滚?