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

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

  • TM的启动大致流程
  • GlobalTransactionScanner的初始化
    • initClient初始化TM和RM的客户端
      • TmNettyRemotingClient初始化
        • registerProcessor注册处理器
        • init开启定时重连的任务和初始化netty组件
  • TM进行GlobalTransactionalInterceptor进行方法拦截
    • handleGlobalTransaction进行全局事务处理
      • TransactionalTemplate的execute即TM要做的事
        • TransactionalTemplate的beginTransaction开始事务
        • TransactionalTemplate的completeTransactionAfterThrowing处理异常
        • TransactionalTemplate的commitTransaction提交

TM的启动大致流程

seata源码分析之-AT模式客户端分析2_第1张图片

GlobalTransactionScanner的初始化

上篇说了GlobalTransactionScanner的作用,除了做AOP之外,还有就是初始化TMRM,其实就是和我们的TC建立联系,其实就是通信,底层用的是Netty,我们可以看到这个初始化的方法afterPropertiesSet
seata源码分析之-AT模式客户端分析2_第2张图片
如果启动了全局事务的话,就会进行初始化客户端。

initClient初始化TM和RM的客户端

做了两个客户端的初始化:
seata源码分析之-AT模式客户端分析2_第3张图片

TmNettyRemotingClient初始化

其实就是做了一些处理器的注册,然后初始化
seata源码分析之-AT模式客户端分析2_第4张图片

registerProcessor注册处理器

这里其实就是要注册一些处理消息类型,比如开始,提交,报告,心跳,回滚等处理器:
seata源码分析之-AT模式客户端分析2_第5张图片

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

seata源码分析之-AT模式客户端分析2_第6张图片
RmNettyRemotingClient也差不多,不过里面有些细节不一样,这个到时候自己可以去看,暂时就理解到这里就好了,其他先不关系,就是注册一些通信的消息类型和对相应的处理器,底层用NettyTC通信。

TM进行GlobalTransactionalInterceptor进行方法拦截

基本初始化的东西讲完了,细节还是要自己去看,然后我们看我们的方法怎么就可以进行全局事务。我们进行这个接口的调用:
seata源码分析之-AT模式客户端分析2_第7张图片
最终methodInvocationGlobalTransactionalInterceptor拦截了,进行注解GlobalTransactional的获取,然后调用handleGlobalTransaction
seata源码分析之-AT模式客户端分析2_第8张图片

handleGlobalTransaction进行全局事务处理

主要还是TransactionalTemplateexecute方法:
seata源码分析之-AT模式客户端分析2_第9张图片

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方法
seata源码分析之-AT模式客户端分析2_第10张图片
其实就是事务开始要像TC要个事务的全局XID,这个XIDTC通过类似雪花算法给生成的,然后返回,具体可以看TC服务端的代码,后面会分析。这个时候就是用前面准备的TM里的netty组件进行通信的,具体就不深入了,然后准备开始事务了。
seata源码分析之-AT模式客户端分析2_第11张图片
成功后会获得XID
seata源码分析之-AT模式客户端分析2_第12张图片
此时我们也可以看到TC服务端也写入global_table表了:
seata源码分析之-AT模式客户端分析2_第13张图片
其实这里就是TM发起事务,然后会调用我们的正常事务逻辑:
seata源码分析之-AT模式客户端分析2_第14张图片

TransactionalTemplate的completeTransactionAfterThrowing处理异常

比如我这边出现异常了:
seata源码分析之-AT模式客户端分析2_第15张图片
这个时候会进行回滚,会通知TC进行回滚,而且是有一定重试次数的,默认5次:
seata源码分析之-AT模式客户端分析2_第16张图片
其实也就是告诉TC,某个XID的全局事务要回滚:
seata源码分析之-AT模式客户端分析2_第17张图片

TransactionalTemplate的commitTransaction提交

当然这个也类似,就不多说了:
seata源码分析之-AT模式客户端分析2_第18张图片
seata源码分析之-AT模式客户端分析2_第19张图片
好了,TM做的事情基本就这些了,进行全局事务的开启,回滚,提交,当然具体的RM怎么做的我们后面会说。今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

你可能感兴趣的:(seata,seata,seata源码,分布式事务,事务,TCC)