事务提交基本原理
TM发送全局事务请求到TC,TC发送branch commit请求到Order,Account,Storage 三个业务分支,三个业务分支各自提交本地事务。
上图四个业务代码在seata-samples/spring-boot-mybatis项目
TC在seata项目
Business
1.BusinessService#purchase
GlobalTransactional注解拦截,调用下面invoke方法
2.GlobalTransactionalInterceptor#invoke
3.GlobalTransactionalInterceptor#handleGlobalTransaction
4.TransactionalTemplate#execute
beginTransaction开启全局事务,主要作用是获取xid.
中间的business.execute()执行的最终代码是下面红色框的业务代码,代码位置BusinessService#purchase
commitTransaction提交事务
5.TransactionalTemplate#commitTransaction
6.DefaultGlobalTransaction#commit
7.DefaultTransactionManager#commit
生成全局commit请求,设置xid,发送同步请求到TC。
下面看看TC服务端是怎么处理的
TC
8.DefaultCoordinator#init
初始化定时器,定时处理commit请求,默认一秒执行一次
9.DefaultCoordinator#handleAsyncCommitting
10.DefaultCore#doGlobalCommit
循环遍历Order,Storage,Account分支,发送branchCommit消息。下面看看Account分支的处理逻辑,其他两个分支原理类似。
Account
11.RmMessageListener#onMessage
接受TC传过来的BranchCommit消息
12.RmMessageListener#handleBranchCommit
13.AbstractRMHandler#onRequest
14.AbstractRMHandler#handle
15.AbstractRMHandler#doBranchCommit
提交本地事务,生成响应信息
16.AsyncWorker#branchCommit
把commit的上下文对象phase2Context加入到ASYNC_COMMIT_BUFFER这个BlockingQueue里面。
17.AsyncWorker#init
初始化定时器,定时调用doBranchCommits方法,默认一秒调用一次。
18.AsyncWorker#doBranchCommits
private void doBranchCommits() {
if (ASYNC_COMMIT_BUFFER.isEmpty()) {
return;
}
Map<String, List<Phase2C