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
怎么做的我们后面会说。今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。