欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring 的事务传播行为

程序员文章站 2022-05-06 21:42:11
...

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(){

}

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

Spring 的事务传播行为