一 spring事务传播级别
1.1 总结概述
方法A:外围方法,方法B:内部方法,在A中调用B
1.事务级别PROPAGATION_REQUIRED:
如果A为PROPAGATION_REQUIRED:B 不管有没有设置事务级别,都会加入到A的事务级别中。如果执行B的时候出异常,那么不仅B方法里执行的会被回滚,A也会全回滚。所有Propagation.REQUIRED修饰的内部方法和外围方法均属于同一事务,只要一个方法回滚,整个事务均回滚
如果A没有设置事务级别,Propagation.REQUIRED修饰的内部方法B会新开启自己的事务,且开启的事务相互独立,互不干扰。
2.事务级别PROPAGATION_support:
如果A为PROPAGATION_REQUIRED:B 不管有没有设置事务级别,都会加入到A的事务级别中。如果执行B的时候出异常,那么不仅B方法里执行的会被回滚,A也会全回滚。所有Propagation.REQUIRED修饰的内部方法和外围方法均属于同一事务,只要一个方法回滚,整个事务均回滚
如果A没有设置事务级别,Propagation.support修饰的内部方法B,就不开启新的事务,会以非事务方式运行。
3.事务级别PROPAGATION_MANDATORY(强制传播):
如果A为PROPAGATION_REQUIRED:B 不管有没有设置事务级别,都会加入到A的事务级别中。如果执行B的时候出异常,那么不仅B方法里执行的会被回滚,A也会全回滚。所有Propagation.REQUIRED修饰的内部方法和外围方法均属于同一事务,只要一个方法回滚,整个事务均回滚
如果A没有设置事务级别,Propagation.MANDATORY修饰的内部方法B,就抛出异常,即必须在事务的环境下运行。
4.事务级别PROPAGATION_REQUIRED_NEW:
如果A为PROPAGATION_REQUIRED:B不管有没有设置事务级别PROPAGATION_REQUIRED_NEW,都会新开启自己的事务,和方法A的事务,相互独立,互不干扰。各自玩各自的。
5.事务级别PROPAGATION_NOT_SUPPORTED:
如果A为PROPAGATION_REQUIRED:B 设置事务级别PROPAGATION_NOT_SUPPORTED,B会以非事务的方式执行,B执行完后,再以事务的方式执行剩余逻辑,
此时不管B是成功还是失败,对A都不造成影响。此时如果A出现异常,对B也不会造成影响,只会回滚A里的其他的执行。如果是单独执行B方法,直接会以非事务的方式执行。
6.事务级别PROPAGATION_never
如果A为PROPAGATION_REQUIRED:B 有设置事务级别PROPAGATION_never,A调用B 则报异常
如果A没有设置事务级别,B 有设置事务级别PROPAGATION_never,则B以非事务方式运行。
7.事务级别PROPAGATION_nested
如果A为PROPAGATION_REQUIRED:B 有设置事务级别PROPAGATION_nested,外围主事务A回滚,子事务B一定回滚,而内部子事务B可以单独回滚而不影响外围主事务A和其他子事务(需要 catch进去,后边有例子)
如果A没有设置事务级别,B 有设置事务级别PROPAGATION_nested,则Propagation.NESTED和Propagation.REQUIRED作用相同,修饰的内部方法B都会新开启自己的事务,且开启的事务相互独立,互不干扰。
https://www.cnblogs.com/sjj123/p/16677875.html
【spring】spring 的事务(transaction) 四 嵌套事务PROPAGATION_NESTED_云川之下的博客-CSDN博客
【Spring】彻底搞明白事物的传播级别_事务传播级别-CSDN博客
1.2 PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别
PROPAGATION_REQUIRES_NEW内层事务执行完就立即提交。
PROPAGATION_NESTED 子事务执行完,不会立即提交,而是等待外层事务完成后一起提交。