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
-
数据源代理
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