2023-09-16
原文作者:王伟王胖胖 原文地址: https://blog.csdn.net/wangwei19871103/article/details/105368381

创建事务信息流程图

202309162320214341.png

处理提交流程图

202309162320221972.png

处理回滚流程图

202309162320227623.png

外部方法回滚处理

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

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

202309162320238645.png

清除处理

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

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

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

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

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

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

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

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

阅读全文