Spring 5.x 源码之旅-75事务细节分析四

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

 

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

 

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

 

创建事务信息流程图

处理提交流程图

处理回滚流程图

外部方法回滚处理

前面说了,内部异常后,事务没做什么,只是设置了全局回滚的标记,处理完之后异常还会继续往上抛:


然后来看外部的事务怎么处理,先看外部事务状态,此时可见连接持有器的回滚标记已经被内部事务改成true了,因为外部事务创建的时候是一个新事务,所以就可以执行doRollback,内部就是JDBC连接的回滚:

清除处理

回滚完了之后到了清除方法中,这两个方法是满足条件可以执行的:


一个就是把线程私有变量的属性全部清除了:


另一个进行数据源和连接资源的解绑,因为马上就要释放连接资源了,然后把连接的属性设置回来,比如自动提交,隔离级别,只读设置等:


解绑会把数据清干净,不会产生内存泄露:


最后还有连接的释放,只有创建他的那个事务才可以释放:


连接持有器会清空回滚标记:


好了,两个REQUIRED出异常的情况分析过了,其实就是内部只是会标记一下,最后还是外部存在的那个事务去回滚。下次我们分析REQUIREDREQUIRES_NEW,还是以事务状态来讲比较好理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值