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 配置文件中使用:

在需要事务的方法上使用

@Transactional

public void xxx(){

}

事务管理的思维导图如下图:

Spring 的事务传播行为_第1张图片

你可能感兴趣的:(Spring)