seata源码分析之-AT模式客户端分析2
TM的启动大致流程

GlobalTransactionScanner的初始化
上篇说了GlobalTransactionScanner的作用,除了做AOP之外,还有就是初始化TM和RM,其实就是和我们的TC建立联系,其实就是通信,底层用的是Netty,我们可以看到这个初始化的方法afterPropertiesSet:

如果启动了全局事务的话,就会进行初始化客户端。
initClient初始化TM和RM的客户端
做了两个客户端的初始化:

TmNettyRemotingClient初始化
其实就是做了一些处理器的注册,然后初始化

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

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

RmNettyRemotingClient也差不多,不过里面有些细节不一样,这个到时候自己可以去看,暂时就理解到这里就好了,其他先不关系,就是注册一些通信的消息类型和对相应的处理器,底层用Netty和TC通信。
TM进行GlobalTransactionalInterceptor进行方法拦截
基本初始化的东西讲完了,细节还是要自己去看,然后我们看我们的方法怎么就可以进行全局事务。我们进行这个接口的调用:

最终methodInvocation被GlobalTransactionalInterceptor拦截了,进行注解GlobalTransactional的获取,然后调用handleGlobalTransaction:

handleGlobalTransaction进行全局事务处理
主要还是TransactionalTemplate的execute方法:

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开始事务
首先是事务开始前做的事情,主要是调用DefaultGlobalTransaction的begin方法

其实就是事务开始要像TC要个事务的全局XID,这个XID是TC通过类似雪花算法给生成的,然后返回,具体可以看TC服务端的代码,后面会分析。这个时候就是用前面准备的TM里的netty组件进行通信的,具体就不深入了,然后准备开始事务了。

成功后会获得XID:

此时我们也可以看到TC服务端也写入global_table表了:

其实这里就是TM发起事务,然后会调用我们的正常事务逻辑:

TransactionalTemplate的completeTransactionAfterThrowing处理异常
比如我这边出现异常了:

这个时候会进行回滚,会通知TC进行回滚,而且是有一定重试次数的,默认5次:

其实也就是告诉TC,某个XID的全局事务要回滚:

TransactionalTemplate的commitTransaction提交
当然这个也类似,就不多说了:


好了,TM做的事情基本就这些了,进行全局事务的开启,回滚,提交,当然具体的RM怎么做的我们后面会说。今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。
本文详细解析Seata AT模式下,TM的启动流程及其关键步骤,包括GlobalTransactionScanner初始化、TmNettyRemotingClient配置、消息处理器注册、定时重连任务设置等,并介绍如何通过GlobalTransactionalInterceptor进行方法拦截及全局事务处理。
912

被折叠的 条评论
为什么被折叠?



