Spring 事务传播行为

2021-04-19 18:27

阅读:564

我们先来假设一个场景
在 ServiceA 中方法 A() 调用 ServiceB 中方法 B()。
Spring 的事务传播行为就是解决方法之间的事务传播的。
基本方法调用场景如下:

  • 方法A有事务,方法B也有事务
  • 方法A有事务,方法B没有事务
  • 方法A没有事务,方法B有事务
  • 方法A没有事务,方法B也没有事务

1. PROPAGATION_REQUIRED

支持当前事务,如果当前没有事务,就新建一个事务。他也是Spring提供的默认事务传播行为,适合绝大数情况。

如果A方法有事务,那么B方法就使用A方法的事务。
如果A方法没有事务,那么B方法就创建一个新事物。

2. PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

如果A方法有事务,那么B方法就使用A方法的事务。
如果A方法没有事务,那么B方法就不使用事务的方式执行。

3. PROPAGATION_MANDATORY

支持当前事务,如果当前没有事务,就抛出异常。

如果A方法有事务,那么A方法就使用A方法事务。
如果A方法没有事务,那么就抛出异常。

该事务传播行为要求A方法必须以事务的方式运行

4. PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

如果A方法有事务,就把A方法的事务挂起,B方法新创建一个事务。
如果A方法没有事务,那么B方法就创建一个新事务。

5. PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

如果A方法有事务,那么就把A方法的事务挂起,B方法以非事务的方式执行。
如果A方法没有事务,那么B也不使用事务执行。

6. PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

如果方法A有事务,那么就抛出异常。
如果方法A没有事务,那么B方法就以非事务的方式运行。

跟 3. PROPAGATION_MANDATORY 事务传播行为相反。

7. PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的。

如果A方法有事务,那么B方法就在A方法的事务中使用嵌套事务。
如果A方法没有事务,那么方法B就新创建一个事务。

嵌套事务

嵌套事务是使用数据库的SavePoint(事务保存点)。需要底层数据库的支持。
如果在Spring使用嵌套事务,需要满足一下3点。

  • 需要数据库支持。
    可以使用以下代码来判断数据库是否支持。


评论


亲,登录后才可以留言!