| 传播行为 | 描述 |
|---|---|
| PROPAGATION_REQUIRED | 如果没有,就开启一个事务;如果有,就加入当前事务。(方法B看到自己已经运行在方法A的事务内部,就不再起新的事务,直接加入方法A) |
| RROPAGATION_REQUIRES_NEW | 如果没有,就开启一个事务;如果有,就将当前事务挂起。(方法A所在的事务就会挂起,方法B会起一个新的事务,等待方法B的事务完成以后,方法A才继续执行) |
| PROPAGATION_NESTED | 如果没有就开启一个新的事务;如果有,就在当前事务中嵌套其他事务 |
| PROPAGATION_SUPPORTS | 如果没有,就以非事务方式执行;如果有,就加入当前事务。(方法B看到自己已经运行在方法A的事务内部,就不再起新的事务,直接加入方法A) |
| PROPAGATION_NOT_SUPPORTED | 如果没有,就以非事务方式执行;如果有,就将当前事务挂起。(方法A所在的事务就会挂起,而方法B以非事务状态运行完,再继续方法A的事务) |
| PROPAGATION_NEVER | 如果没有,就以非事务方式执行;如果有,就抛出异常。 |
| PROPAGATION_MANDATORY | 如果没有,就抛出异常;如果有,就使用当前事务 |
多个事务之间的合并,互斥等都可以通过设置事务的传播特性来解决
- PROPAGATION_REQUIRED:必被包含事务(增删改必用)
- RROPAGATION_REQUIRES_NEW: 自己新开事务,不管之前是否有事务(事务A在运行;当新开一个事务B,则将事务A挂起(停止运行),执行事务B里的内容,事务B执行完毕后再执行事务A)
- PROPAGATION_SUPPORTS: 支持事务,如果加入的方法有事务,则支持事务,如果没有,不单开事务。(方法A里有一个事务A(比如设定的是PROPAGATION_REQUIRED),B事务加入进来以后(B的事务是PROPAGATION_SUPPORTS),那么事务A和事务B合并,都是PROPAGATION_REQUIRED事务的特性)
- PROPAGATION_NEVER: 不能运行中事务中,如果包在事务中,抛出异常(绝对不能包在事务中,如果敢包,就抛出异常,停止运行)
- PROPAGATION_NOT_SUPPORTED: 不支持事务,运行在非事务环境(A是有事务,A事务在运行,等调到B的时候(B不支持事务),A事务挂起,B在非事务的环境中运行,运行结束再把A事务继续执行)
不常用
- PROPAGATION_MANDATORY: 必须包在事务中,没有事务则抛出异常
- PROPAGATION_NESTED: 嵌套事务
