文章目录
事务传播行为指的是一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
比如说,有一个A方法,里面调用了B方法,当执行到B方法时,是应该在当前事务里执行,还是重新打开一个事务来执行,这是由B方法的事务传播行为决定的
七种事务传播行为
PROPAGATION_REQUIRED | 表明当前方法一定要在事务中执行,如果有事务存在,就在当前事务中执行;如果没有,则启动一个新的业务执行 |
---|---|
PROPAGATION_SUPPORTS | 表明当前方法可以不在事务中执行,如果有事务存在,才会在事务中执行,否则就会以非事务的方式执行 |
PROPAGATION_MANDATORY | 表明当前方法一定要在事务中执行,如果不存在事务,就会抛出一个异常 |
PROPAGATION_REQUIRED_NEW | 表明当前方法必须运行在自己的事务中,如果当前事务存在的话,会将原来事务挂起,然后启动新事务来执行这个方法,方法执行完成后,才会将原来的事务恢复,原来的事务和新启动的事务是互不干扰的 |
PROPAGATION_NOT_SUPPORTED | 表明当前方法不在事务中运行,如果当前事务存在的话,会将原来事务挂起,然后以非事务的方式执行完当前方法,然后再恢复原有事务 |
PROPAGATION_NEVER | 表明当前方法不能运行在事务中,如果当前事务存在,则会抛出异常 |
PROPAGATION_NESTED | 表明嵌套事务,如果当前事务存在的话,会在事务内部开启一个事务,并且原来事务不会被挂起,也就是说,外部事务和内部事务是有关系的,外部事务的回滚会导致内部事务的回滚 |
主要就是PROPAGATION_REQUIRED_NEW和PROPAGATION_NESTED的区别:
两者都是嵌套事务,区别就是,前者的外部事务和内部事务是不关联的,外部事务的无法回滚和提交内部事务,也就是说外部事务的执行成功与否不影响内部事务的回滚或提交;而后者的外部事务与内部事务是相关联的,外部事务的执行失败会导致内部事务的回滚