seata源码分析之-AT模式客户端分析2

TM的启动大致流程

在这里插入图片描述

GlobalTransactionScanner的初始化

上篇说了GlobalTransactionScanner的作用,除了做AOP之外,还有就是初始化TMRM,其实就是和我们的TC建立联系,其实就是通信,底层用的是Netty,我们可以看到这个初始化的方法afterPropertiesSet
在这里插入图片描述
如果启动了全局事务的话,就会进行初始化客户端。

initClient初始化TM和RM的客户端

做了两个客户端的初始化:
在这里插入图片描述

TmNettyRemotingClient初始化

其实就是做了一些处理器的注册,然后初始化
在这里插入图片描述

registerProcessor注册处理器

这里其实就是要注册一些处理消息类型,比如开始,提交,报告,心跳,回滚等处理器:
在这里插入图片描述

init开启定时重连的任务和初始化netty组件

在这里插入图片描述
RmNettyRemotingClient也差不多,不过里面有些细节不一样,这个到时候自己可以去看,暂时就理解到这里就好了,其他先不关系,就是注册一些通信的消息类型和对相应的处理器,底层用NettyTC通信。

TM进行GlobalTransactionalInterceptor进行方法拦截

基本初始化的东西讲完了,细节还是要自己去看,然后我们看我们的方法怎么就可以进行全局事务。我们进行这个接口的调用:
在这里插入图片描述
最终methodInvocationGlobalTransactionalInterceptor拦截了,进行注解GlobalTransactional的获取,然后调用handleGlobalTransaction
在这里插入图片描述

handleGlobalTransaction进行全局事务处理

主要还是TransactionalTemplateexecute方法:
在这里插入图片描述

TransactionalTemplate的execute即TM要做的事

里面主要的就是这个模板,其实这个跟spring的事务类似的流程。

  try {
                // 2. If the tx role is 'GlobalTransactionRole.Launcher', send the request of beginTransaction to TC,
                //    else do nothing. Of course, the hooks will still be triggered.
                beginTransaction(txInfo, tx);

                Object rs;
                try {
                    // Do Your Business
                    rs = business.execute();
                } catch (Throwable ex) {
                    // 3. The needed business exception to rollback.
                    completeTransactionAfterThrowing(txInfo, tx, ex);
                    throw ex;
                }

                // 4. everything is fine, commit.
                commitTransaction(tx);

                return rs;
            } finally {
                //5. clear
                resumeGlobalLockConfig(previousConfig);
                triggerAfterCompletion();
                cleanUp();
            }
TransactionalTemplate的beginTransaction开始事务

首先是事务开始前做的事情,主要是调用DefaultGlobalTransactionbegin方法
在这里插入图片描述
其实就是事务开始要像TC要个事务的全局XID,这个XIDTC通过类似雪花算法给生成的,然后返回,具体可以看TC服务端的代码,后面会分析。这个时候就是用前面准备的TM里的netty组件进行通信的,具体就不深入了,然后准备开始事务了。
在这里插入图片描述
成功后会获得XID
在这里插入图片描述
此时我们也可以看到TC服务端也写入global_table表了:
在这里插入图片描述
其实这里就是TM发起事务,然后会调用我们的正常事务逻辑:
在这里插入图片描述

TransactionalTemplate的completeTransactionAfterThrowing处理异常

比如我这边出现异常了:
在这里插入图片描述
这个时候会进行回滚,会通知TC进行回滚,而且是有一定重试次数的,默认5次:
在这里插入图片描述
其实也就是告诉TC,某个XID的全局事务要回滚:
在这里插入图片描述

TransactionalTemplate的commitTransaction提交

当然这个也类似,就不多说了:
在这里插入图片描述
在这里插入图片描述
好了,TM做的事情基本就这些了,进行全局事务的开启,回滚,提交,当然具体的RM怎么做的我们后面会说。今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值