- 多个事务方法相互调用时,事务如何在这些方法之间进行传播,Spring中提供了七种不同的传播机制,来保证事务的正常执行:
- REQUIRED:默认的传播机制,如果存在事务,则支持/加入当前事务,如果当前没有事务,则新建一个事务
- SUPPORTS:如果存在事务,则支持当前事务,如果当前没有事务,则以非事务的方式执行
- MANDATORY(强制的):如果存在事务,则支持当前事务,如果当前没有事务,则抛出异常
- REQUIRED_NEW:如果存在事务,则挂起当前事务,如果当前没有事务,则新建一个事务
- NOT_SUPPORTED:如果存在事务,则挂起当前事务,否则以非事务的方式运行
- NEVER:如果存在事务,则抛出异常,否则以非事务的方式运行
- NESTED:如果存在事务,则开启嵌套事务运行,否则新建一个事务
- 支持事务
将子方法的逻辑添加到主方法的事务中,由主方法的事务进行控制
-
事务挂起
新建事务时,将现有的Connection1保存到ThreadLocal中(它还有尚未提交的事务),然后创建Connection2,Connection2提交、回滚、关闭完毕后,再把Connection1取出来,完成提交、回滚、关闭等动作,保存Connection1的动作称之为事务挂起
-
REQUIRED_NEW和NESTED的区别
- REQUIRED_NEW是新开一个事务且该事务与原事务无关,而NESTED是当前存在事务时会开启一个嵌套事务
- REQUIRED_NEW原事务回滚不会影响新开的事务,NESTED父事务回滚,子事务也会回滚
-
REQUIRED_NEW和NESTED的共同点
新事务回滚都不会影响原事务 -
REQUIRED和NESTED的区别
REQUIRED情况下,主方法存在事务时,子方法和主方法使用的是同一个事务,所以子方法出现异常,无论主方法是否catch,事务都会回滚;NESTED情况下,子方法出现异常,如果主方法catch其异常,那么只有子事务回滚,父事务不会回滚 -
REQUIRED和NESTED的共同点
主方法回滚,子方法会都会跟着回滚