此源码分析只针对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的处理方案等等以系列行为,感兴趣的同志,一起探索吧