数据库事务原理详解-事务的嵌套
通过上面的理论知识的铺垫,我们大致知道了数据库事务和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。
另外三种事务传播属性基本用不到,在此不做分析。
数据库事务原理详解-事务的嵌套相关推荐
- 数据库事务原理详解-事务基本概念
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).特点:事务是恢复和并发控制的基本单位.事务应该具有4 个属性:原子性.一致性.隔离性.持久性.这四个属性 ...
- Spring事务原理详解
一.使用 spring事务开启和使用比较简单,需要有数据源和事务管理器,然后在启动门面类上开启事务,在需要使用事务的地方添加注解就可以了,我们简单做一下回顾. 1.配置数据源 spring.datas ...
- 数据库事务原理详解-Spring 事务的传播属性
所谓spring 事务的传播属性,就是定义在存在多个事务同时存在的时候,spring 应该如何处理这些事务的行为.这些属性在TransactionDefinition 中定义,具体常量的解释见下表: ...
- MySQL事务原理详解,一篇文章让你搞懂
事务(ACID) 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况.我们把这种要么全做,要么 ...
- Spring 事务原理详解
一.事务的基本原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: ...
- Spring5源码分析系列(九)Spring事务原理详解
终于等到了B站的薪资沟通电话,美滋滋,本节开始进入Spring数据访问篇,讲解spring事务,文章参考自Tom老师视频. 事务基本概念 事务(Transaction)是访问并可能更新数据库中各种数据 ...
- mysql 事务原理详解
前言 事务是mysql Innodb引擎的一大特点,可以说,在日常开发中,对于mysql事务的使用无处不在,因此深入了解并掌握mysql的事务原理很有必要. 一.mysql事务简介 事务 是一组操作集 ...
- Spring学习总结(26)——Spring事务原理详解
一.事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: (1).获 ...
- Mysql事务原理详解
事物 目的 事务将数据库从一种一致性状态转换为另一种一致性状态: 组成 事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成: Innodb支持事务,Myisam是不支持事务的.这个 ...
最新文章
- HDOJ-2062 :Subset sequence(DP)
- GUI_Download的Codepage参数
- 问题 1045: [编程入门]自定义函数之整数处理
- linux -- control service and daemon process
- 配置ssl证书_Mysql配置ssl证书
- “3遍读书法” 我是这样自学编程的
- 坐等价格!小米Civi今日下午发布:女性用户青睐之选
- 95-280-038-源码-资源管理-计算资源管理-TaskSlot-JobManager 中 Slot 的管理
- 关于Java锁机制面试官会怎么问,深刻易懂
- Linux vlan间路由配置,VLAN间路由
- RK3399外设驱动之MIPI显示-panel配置
- 如何找到两个圆的公切线?
- Java编程快速有效的学习方法有哪些?
- u盘启动 联想一体机_联想一体机如何进入bios设置u盘启动_联想一体机设置U盘启动步骤...
- vue 使用emoji表情包
- mysql 字符串的hash函数_经典字符串Hash函数介绍 - yanjun_1982的专栏 - CSDNBlog
- codeforces787A-The Monster
- 九同方ESPICE语法
- igcse计算机科学知识点,常考的IGCSE生物知识点汇总 IG生物想拿A*这些考点你都会做了吗...
- EMNLP 2022投稿要求