上一篇 <<<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的区别
网友评论