Seata-核心源码分析

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-10-05 07:20 被阅读0次

上一篇 <<<Seata-TM执行时突然宕机了会造成什么问题
下一篇 >>>SpringBoot整合Seata


1.初始化

spring.factories中的GlobalTransactionAutoConfiguration加载GlobalTransactionScanner,使得对象初始化后注册TM和TC保持长连接。
--GlobalTransactionScanner继承AbstractAutoProxyCreator类【SpringAOP原生类 创建代理对象】
--GlobalTransactionScanner实现InitializingBean【SpringBena生命周期初始化】
----afterPropertiesSet() 调用initClient(),继而调用rmRpcClient.init()使用netty技术完成TM和TC之间的长连接
----AbstractAutoProxyCreator的回调方法wrapIfNecessary 创建我们的代理类GlobalTransactionalInterceptor 实现后续的注解拦截

2.GlobalTransactionalInterceptor的invoke方法拦截

@GlobalTransactional注解
---核心类:TransactionalTemplate的execute方法
1)、GlobalTransactionContext.getCurrentOrCreate();//判断事务不存在则创建
2)、beginTransaction(txInfo, tx);---从TC中获取xid并缓存到threadLocal中,包含超时时间
3)、business.execute();//执行业务

--AbstractDMLBaseExecutor.executeAutoCommitTrue()----真正sql语句执行时的执行器
{
    //获得代理
    AbstractConnectionProxy connectionProxy = statementProxy.getConnectionProxy();
    //设置不自动提交
    connectionProxy.setAutoCommit(false);
    //SQL前后置镜像记录保持---undo_log记录的添加
    T result = executeAutoCommitFalse(args);
    {
        //数据库更新前的值信息
        TableRecords beforeImage = beforeImage();
        //真正sql执行
        T result = statementCallback.execute(statementProxy.getTargetStatement(), args);
        //数据库更新后的值
        TableRecords afterImage = afterImage(beforeImage);
        //前后信息保持到undo_log表中
        prepareUndoLog(beforeImage, afterImage);
    }
    //事务提交
    connectionProxy.commit();
}

4)、rollbackTransaction(tx, ex);//事务回滚
commitTransaction(tx);//事务提交
5)、triggerAfterCompletion();//结束通知

3.xid的传递

发起方在SeataRestTemplateInterceptor将xid写入头部
String xid = RootContext.getXID();
requestWrapper.getHeaders().add("TX_XID", xid);

参与方SeataHandlerInterceptor从头部获取xid并加入到本地缓存中
String rpcXid = request.getHeader("TX_XID");
RootContext.bind(rpcXid);


推荐阅读:
<<<分布式事务产生的背景
<<<解决分布式事务的核心思路
<<<柔性事务和刚性事务(ACID)
<<<CAP理论简单概况
<<<Base理论核心思想
<<<一致性协议--XA接口
<<<一致性协议--Jta规范
<<<一致性协议--2PC提交协议
<<<一致性协议--3PC提交协议
<<<2PC与3PC协议的提交区别
<<<主流的分布式事务解决框架
<<<LCN-框架介绍
<<<LCN-实现原理剖析
<<<LCN-事务协调者(TM)安装启动
<<<SpringBoot整合LCN
<<<LCN-核心源码分析
<<<LCN-集群模式介绍
<<<Seata-框架介绍
<<<Seata原理实现/执行流程/生命周期
<<<Seata-TM执行时突然宕机了会造成什么问题
<<<SpringBoot整合Seata
<<<Seata与Lcn的区别

相关文章

网友评论

    本文标题:Seata-核心源码分析

    本文链接:https://www.haomeiwen.com/subject/gzkrwltx.html