通过上面的理论知识的铺垫,我们大致知道了数据库事务和Spring 事务的一些属性和特点,接下来我们通过分析一些嵌套事务的场景,来深入理解Spring 事务传播的机制。

假设外层事务Service A 的Method A() 调用内层Service B 的Method B()PROPAGATION_REQUIRED(Spring 默认)

如果ServiceB.MethodB() 的事务级别定义为PROPAGATION_REQUIRED,那么执行ServiceA.MethodA() 的时候Spring 已经起了事务,这时调用ServiceB.MethodB(),ServiceB.MethodB() 看到自己已经运行在ServiceA.MethodA() 的事务内部,就不再起新的事务。

假如ServiceB.MethodB() 运行的时候发现自己没有在事务中,他就会为自己分配一个事务。

这样,在ServiceA.MethodA() 或者在ServiceB.MethodB() 内的任何地方出现异常,事务都会被回滚。

PROPAGATION_REQUIRES_NEW比如我们设计ServiceA.MethodA() 的事务级别为PROPAGATION_REQUIRED,ServiceB.MethodB() 的事务级别为PROPAGATION_REQUIRES_NEW。

那么当执行到ServiceB.MethodB() 的时候,ServiceA.MethodA() 所在的事务就会挂起,ServiceB.MethodB() 会起一个新的事务,等待ServiceB.MethodB() 的事务完成以后,它才继续执行。

他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.MethodB() 是新起一个事务, 那么就是存在两个不同的事务。如果ServiceB.MethodB() 已经提交, 那么ServiceA.MethodA() 失败回滚,ServiceB.MethodB() 是不会回滚的。如果ServiceB.MethodB() 失败回滚,如果他抛出的异常被ServiceA.MethodA() 捕获,ServiceA.MethodA() 事务仍然可能提交(主要看B 抛出的异常是不是A 会回滚的异常)。

PROPAGATION_SUPPORTS

假设ServiceB.MethodB() 的事务级别为PROPAGATION_SUPPORTS,那么当执行到ServiceB.MethodB()时,如果发现ServiceA.MethodA()已经开启了一个事务,则加入当前的事务,如果发现ServiceA.MethodA()没有开启事务,则自己也不开启事务。这种时候,内部方法的事务性完全依赖于最外层的事务。

PROPAGATION_NESTED

现在的情况就变得比较复杂了, ServiceB.MethodB() 的事务属性被配置为PROPAGATION_NESTED, 此时两者之间又将如何协作呢? ServiceB.MethodB() 如果rollback, 那么内部事务(即ServiceB.MethodB()) 将回滚到它执行前的SavePoint而外部事务(即ServiceA.MethodA()) 可以有以下两种处理方式:

捕获异常,执行异常分支逻辑

void MethodA() {try {ServiceB.MethodB();} catch (SomeException) {// 执行其他业务, 如ServiceC.MethodC();}
}

这种方式也是嵌套事务最有价值的地方, 它起到了分支执行的效果, 如果ServiceB.MethodB()失败, 那么执行ServiceC.MethodC(), 而ServiceB.MethodB()已经回滚到它执行之前的SavePoint, 所以不会产生脏数据(相当于此方法从未执行过),这种特性可以用在某些特殊的业务中, 而PROPAGATION_REQUIRED 和PROPAGATION_REQUIRES_NEW 都没有办法做到这一点。

外部事务回滚/提交代码不做任何修改, 那么如果内部事务(ServiceB.MethodB())rollback, 那么首先ServiceB.MethodB() 回滚到它执行之前的SavePoint(在任何情况下都会如此), 外部事务( 即ServiceA.MethodA()) 将根据具体的配置决定自己是commit 还是rollback。

另外三种事务传播属性基本用不到,在此不做分析。

数据库事务原理详解-事务的嵌套相关推荐

  1. 数据库事务原理详解-事务基本概念

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).特点:事务是恢复和并发控制的基本单位.事务应该具有4 个属性:原子性.一致性.隔离性.持久性.这四个属性 ...

  2. Spring事务原理详解

    一.使用 spring事务开启和使用比较简单,需要有数据源和事务管理器,然后在启动门面类上开启事务,在需要使用事务的地方添加注解就可以了,我们简单做一下回顾. 1.配置数据源 spring.datas ...

  3. 数据库事务原理详解-Spring 事务的传播属性

    所谓spring 事务的传播属性,就是定义在存在多个事务同时存在的时候,spring 应该如何处理这些事务的行为.这些属性在TransactionDefinition 中定义,具体常量的解释见下表: ...

  4. MySQL事务原理详解,一篇文章让你搞懂

    事务(ACID) 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况.我们把这种要么全做,要么 ...

  5. Spring 事务原理详解

    一.事务的基本原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:     ...

  6. Spring5源码分析系列(九)Spring事务原理详解

    终于等到了B站的薪资沟通电话,美滋滋,本节开始进入Spring数据访问篇,讲解spring事务,文章参考自Tom老师视频. 事务基本概念 事务(Transaction)是访问并可能更新数据库中各种数据 ...

  7. mysql 事务原理详解

    前言 事务是mysql Innodb引擎的一大特点,可以说,在日常开发中,对于mysql事务的使用无处不在,因此深入了解并掌握mysql的事务原理很有必要. 一.mysql事务简介 事务 是一组操作集 ...

  8. Spring学习总结(26)——Spring事务原理详解

    一.事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: (1).获 ...

  9. Mysql事务原理详解

    事物 目的 事务将数据库从一种一致性状态转换为另一种一致性状态: 组成 事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成: Innodb支持事务,Myisam是不支持事务的.这个 ...

最新文章

  1. HDOJ-2062 :Subset sequence(DP)
  2. GUI_Download的Codepage参数
  3. 问题 1045: [编程入门]自定义函数之整数处理
  4. linux -- control service and daemon process
  5. 配置ssl证书_Mysql配置ssl证书
  6. “3遍读书法” 我是这样自学编程的
  7. 坐等价格!小米Civi今日下午发布:女性用户青睐之选
  8. 95-280-038-源码-资源管理-计算资源管理-TaskSlot-JobManager 中 Slot 的管理
  9. 关于Java锁机制面试官会怎么问,深刻易懂
  10. Linux vlan间路由配置,VLAN间路由
  11. RK3399外设驱动之MIPI显示-panel配置
  12. 如何找到两个圆的公切线?
  13. Java编程快速有效的学习方法有哪些?
  14. u盘启动 联想一体机_联想一体机如何进入bios设置u盘启动_联想一体机设置U盘启动步骤...
  15. vue 使用emoji表情包
  16. mysql 字符串的hash函数_经典字符串Hash函数介绍 - yanjun_1982的专栏 - CSDNBlog
  17. codeforces787A-The Monster
  18. 九同方ESPICE语法
  19. igcse计算机科学知识点,常考的IGCSE生物知识点汇总 IG生物想拿A*这些考点你都会做了吗...
  20. EMNLP 2022投稿要求

热门文章

  1. 辗转相除最小公倍数的递归求法
  2. jQuery 阻止冒泡和默认事件
  3. JAVAWEB 一一 SpringMVC(注解)
  4. 2016 -1 -3 导航控制器的学习
  5. java Socket 长连接 心跳包 客户端 信息收发 demo
  6. 避免css中文字体在浏览器中解析成乱码
  7. ASP.NET中常用功能代码总结(3)——上传图片到数据库
  8. 通向架构师的道路(第二天)之apache tomcat https应用
  9. Linux stat命令总结
  10. CentOS 7配置IP的几种方法。