AT流程(源码) #625
Unanswered
luky116
asked this question in
Technology sharing
AT流程(源码)
#625
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
数据源代理
AT模式是对底层数据源进行了一层代理,当业务SQL执行前后,会被这层代理拦截,执行操作undo log的逻辑,以及事务的提交或回滚。如下是AT代理的所有类:

初始化数据源的时候,同时注册资源:
我们需要重点关注的是SQL执行过程中的SQL解析部分,也就是Statement相关的代理类。此处选择最常用的PreparedStatementProxy.execute方法进行源码分析(其他方法最终入口都是一致的):
进入ExecuteTemplate中可以看到具体的代理逻辑:
进入execute方法,看看执行的逻辑:
doExecute方法中可以看到两个方法,一个是属于事务自动提交的,另一个是属于事务手动提交的。这两个方法有何差异,先来看下自动提交的executeAutoCommitTrue:
来看下 executeAutoCommitFalse 的逻辑:
todo:
1、是在哪里插入的undo log?2、lock key的作用是啥?
准备好undo log 后,会在Connection 中进行提交:
到此为止,AT事务的一阶段提交,就全部完成了。
todo:commit是谁执行的呢?二阶段提交
一阶段把undo log和业务逻辑都commit到数据库了,二阶段主要是负责把undo log进行清理,他的执行流程如下。
第一步,processor监听到TC发送的事务确认消息:
doBranchCommit里面实际调用了下面的逻辑,将事务信息加入异步队列,以异步的方式处理,提高效率:
实际逻辑如下:
回滚的逻辑如下:
至此,AT的全部逻辑,就都过完了。
Beta Was this translation helpful? Give feedback.
All reactions