76、Spring5.x源码之旅七十七事务细节分析六

  • 创建事务信息流程图
  • 处理提交流程图
  • 处理回滚流程图
  • 外层是REQUIRED有异常捕获内层是NESTED
    • 事务状态
  • 异常回滚
  • 外层是REQUIRED有异常内层是NESTED

创建事务信息流程图

*

处理提交流程图

*

处理回滚流程图

*

外层是REQUIRED有异常捕获内层是NESTED

*
*

事务状态

外层:
*
内层用外层的连接,而且不是新事务,不是新同步:
*

异常回滚

内层直接进保存点回滚:
*
会重置连接持有器的回滚标记:
*
外层因为有异常捕获,而且连接持有器的回滚标记是false,所以成功提交。

外层是REQUIRED有异常内层是NESTED

*
*
结果是全回滚,因为内层成功了提交就把保存点上方了,其他什么都不做,然后外层遇到异常就直接回滚了。

所以这里就是一个好的例子,如果内层业务出了异常,外层捕获后就不会影响外层。比如前面说过的插入数据在外层,内层是打日志,就算打日志出现异常,也只是影响日志,外部的数据插入还是可以的,反过来如果日志没问题,但是外面数据插入出异常,整个都回滚,可以符合我们的一些业务。

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