Seata1.4-----源码解析

389 阅读1分钟

此源码分析只针对Mysql数据源,进行分析

一.事务管理器(TM)从事务协调者(TC)获取一个全局事务xid

GlobalTransactionalInterceptor.invoke()

此方法主要是过滤方法是否加上**@GlobalTransactional**

DefaultTransactionManager.begin()

TM通过netty长链接,向TC获取全局xid

RootContext.bind(xid)

将全局xid存放到当前线程的ThreadLocal中

二.TM向RM传递全局xid

SeataFeignClient.getModifyRequest()

TM通过SeataFeignClient将全局xid封装到请求头中

三.RM从请求头中获取全局xid,并将全局xid存放到当前线程的ThreadLocal中

TransactionPropagationIntercepter.preHandle()

四.生成前置镜像 和后置镜像

AbstractUndoLogManager.flushUndoLogs()

Select * from orderId=1 state=0 ----前置镜像

Update order set state(1) where orderId=1

Select * from orderId=1 state=1 ----后置镜像

五.实现逆向回滚

DataSourceManager.branchRollback()

AbstractUndoLogManager.undo

AbstractUndoExecutor.executeOn

生成逆向SQL,并进行回滚

六.删除undolog日志

AbstractUndoLogManager.batchDeleteUndoLog

以上代码只是针对seata主流程的解析,只能算上冰山一角.实际上还是有许多地方值得斟酌学习的.比如seata中spring事务传播行为;TC宕机,后续TM、RM的处理方案等等以系列行为,感兴趣的同志,一起探索吧