Seata源码分析之AT模式Commit

在这里插入图片描述

事务提交基本原理

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值