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异常,避免子方法异常而影响主方法事务回滚,主方法要想回滚就得再抛出运行时异常 子方法不能是自调用,也就是不能在同一个类,和代理有关
经验分享 程序员 微信小程序 职场和发展