Spring 的事务传播行为
Spring 一共提供了7种事务传播行为:
- PROPAGATION-REQUIRED
- PROPAGATION_REQUIRES_NEW
- PROPAGATION_NESTED
- PROPAGATION_SUPPORTS
- PROPAGATION_NOT_SUPPORTED
- PROPAGATION_NEVER
- PROPAGATION_MANDATORY
我们首先明确事务从 哪里来传播到哪里去?答案是从方法A 传播到方法B。Spring解决的只是方法之间的事务传播,比如:
- 方法A有事务,方法 B也有事务
- 方法A有事务,方法B没有事务
- 方法A没有事务,方法B有事务
- 方法A没有事务,方法B也没有事务
假设事务从方法A传播到方法 B,问自己一个问题: 方法A有事务吗?
(1) 如果没有,就新建一个事务:如果有,就加入当前事务。这就是PROPAGATION_REQUIRED, 它也是Spring提供的默认事务传播行为,适合绝大多数情况
(2)如果没有,就新建一个事务;如果有,就将当前事务挂起。这就是PROPAGATION_REQUIRES_NEW, 意思就是创建了一个新事务,它和原来 的事务没有任何关系。
(3)如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。这就是PROPAGATION_NESTED,也就是“嵌套事务”,所嵌套的子事务与主事务之间是有关联的( 当主事务提交或回滚,子事务也会提交或回滚)。
(4)如果没有,就以非事务方式执行;如果有,就使用当前事务。这就是PROPAGATION_SUPPORTS , 这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正是支持。
(5) 如果没有,就以非事务方式执行,如果有,就将当前事务挂起。这就是PROPAGATION_NOT_SUPPORTED,这种方式非常强硬,没有就没有,有也不支持,挂起来,不管它。
(6)如果没有,就以非事务方式执行;如果有,就抛出异常。这就是PROPAGATION_NEVER, 这种方式更强硬,没有就没有了,有了反而报错;它对大家宣称:我从不支持事务。
(7)如果没有,就抛出异常;如果有,就使用当前事务。这就是PROPAGATION_MANDATORY,这种方式可以说是最强硬,没有事务直接就报错,它对全世界说:我必须有事务。
推荐Spring 配置文件中使用:
<tx:annotation-driven />
在需要事务的方法上使用
@Transactional
public void xxx(){
}
事务管理的思维导图如下图:
上一篇: 双向链表的实现