这几天看了一下Guzz这个ORM框架,突然看到事务这块去复习了一下
Spring事务一些东西,就看到了
事务传播行为。之前一直觉得这一块比较混乱,所以在稍微整理一下
概念
事务传播行为主要针对被调用的业务对象。
事务的传播行为表示整个事务处理过程所跨越的业务对象,将以什么样的行为参与事
比如A.service()调用了B.service()的业务层方法,那么这个传播行为就是针对B.service()这个方法的。与A无关。
分类
传播行为有一下七种
-
PROPAGATION_REQUIRED。
- 对事务的处理:有则加入,无则创建。保证至少有一个事务,为默认的传播行为。
-
PROPAGATION_SUPPORTS。
- 对事务的处理:有则加入,无则直接执行。一般用于查询的操作;并且可以观察到加入的事务的数据(前提是隔离级别是读未提交)
- 举例:假设金钱为1000,A.service()先调用执行数据库update修改金钱为2000;当隔离级别为读未提交的时候,在A.service()调用B.service()去查询,那么可以观察到金钱变成了2000。
-
PROPAGATION_MANDATORY。
- 对事务的处理:强制必须有事务,否则
报错。 - 场景:某个方法需要事务支持,但自身又不管理事务的提交或者回滚
- 对事务的处理:强制必须有事务,否则
-
PROPAGATION_REQUIRES_NEW
- 对事务的处理:一定会创建新的事务;如果之前有事务则
挂起 - 场景:某个业务对象所做的事情不想影响到外层事务
- 举例:例如我们要记录日志的操作;一个service()方法中有许多操作数据库的方法,当我们执行一个操作数据库的方法我们需要调用日志进行记录;但是日志记录失败肯定不会影响当前业务,可用这个传播行为。
- 对事务的处理:一定会创建新的事务;如果之前有事务则
-
PROPAGATION_NOT_SUPPORTED
- 对事务的处理:总是以非事务的方式执行,如果调用方有事务则
挂起。
- 对事务的处理:总是以非事务的方式执行,如果调用方有事务则
-
PROPAGATION_NEVER
- 对事务的处理:永远不需要当前存在事务,如果存在当前事务,则
抛出异常
- 对事务的处理:永远不需要当前存在事务,如果存在当前事务,则
-
PROPAGATION_NESTED
- 对事务的处理:如果存在事务则嵌套,不存在则创建()。
- 场景:可以将一个大的事务划分为多个小的事务来处理,并且外层事务可以根据各个内部嵌套事务的执行结果
- 嵌套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint
(前提是要catch住异常)。嵌套事务是外部事务的一部分, 只有外部事务结束后它才会被提交。也就是说嵌套事务异常,那么外部事务是不会发生回滚的,他可以回滚到执行这个事务前的状态。
表格解析
| 传播行为 | 调用者事务 (A) | 当前事务(B) | 异常情况 |
|---|---|---|---|
| PROPAGATION_REQUIRED | 有 | 加入 | B异常,A有没有捕获大家都一起回滚 |
| 无 | 创建一个新的事务 | ||
| PROPAGATION_SUPPORTS | 有 | 加入 | |
| 无 | 直接执行 | ||
| PROPAGATION_MANDATORY | 有 | 加入 | |
| 无 | 报错 | ||
| PROPAGATION_REQUIRES_NEW | 有 | 挂起调用者事务,新建一个事务 | |
| 无 | 新建一个事务 | ||
| PROPAGATION_NOT_SUPPORTED | 有 | 挂起调用者事务 | |
| 无 | 直接执行 | ||
| PROPAGATION_NEVER | 有 | 报错 | |
| 无 | 直接执行 | ||
| PROPAGATION_NESTED | 有 | 新建一个事务,并作为调用者的子事务 | B异常,A捕获了的话只有B回滚;A未捕获的话大家一起回滚 |
| 无 | 新建一个事务 |
简单测试
下面就先简单测试两个比较有点疑惑的。
PROPAGATION_REQUIRED
- 调用者(A)操作事务的表

- 当前事务(B)操作的表

代码结果及数据库结果



结论:即使catch住了异常,但是还是一起回滚了。
PROPAGATION_NESTED
- 调用者事务表

- 当前事务表

捕获异常的结果



可以看到:当捕获了异常以后。外部事务正常执行,而当前事务则进行了回滚。
未捕获异常的结果



未捕获异常。大家一起回滚。
参考了一些资料:
https://blog.csdn.net/yanxin1213/article/details/100582643
以及《Spring揭秘》这本书;这本书写的的确很不错,值得去学习研究。
可能有一些地方会存在一些问题,后期深入了解一点会进行完善。
本文详细介绍了Spring的事务传播行为,包括PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY等7种类型,并通过简单测试分析了不同传播行为在异常情况下的事务回滚行为。PROPAGATION_REQUIRED会一起回滚,而PROPAGATION_NESTED在捕获异常时只回滚子事务,未捕获则回滚所有事务。

3768

被折叠的 条评论
为什么被折叠?



