Spring的事务传播行为

本文详细介绍了Spring的事务传播行为,包括PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY等7种类型,并通过简单测试分析了不同传播行为在异常情况下的事务回滚行为。PROPAGATION_REQUIRED会一起回滚,而PROPAGATION_NESTED在捕获异常时只回滚子事务,未捕获则回滚所有事务。


这几天看了一下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揭秘》这本书;这本书写的的确很不错,值得去学习研究。

可能有一些地方会存在一些问题,后期深入了解一点会进行完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值