今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

seata xa实现原理

  Seata 是什么

Seata源码分析 

GlobalTransactionScanner 全局事务扫描器,扫描有@GlobalTransactional注解标记的bean,SeataAutoConfiguration一句spring自动配置原理启动 生成一个GlobalTransactionScanner对象,由于他是集成

AbstractAutoProxyCreator,所以会调用wrapIfNecessary()方法,主要逻辑见下图,最终bean会被初始化为一个被代理的bean,同时这个类代理有一个advisor 对象

GlobalTransactionalInterceptor ,当请求过来时 执行 该拦截器的invoke 方法,然后执行TransactionalTemplate.execute ,然后通知TC(seata-server)开启事务,执行业务方法,

如果执行业务方法没有报错,则开始提交事务。向tc服务发送同步请求提交,并等待tc通知结果

 

由于实现InitializingBean 会调用

afterPropertiesSet()方法,然后调用initClient(); 

初始化TM 和RM

 

xid 的传递,不论使用Feign还是RestTemplate 都需要将全局事务xid 传递到下游服务。 通过在请求头设置TX_XID参数,SeataHttpAutoConfiguration 自动配置SeataWebMvcConfigurer,然后添加拦截器

TransactionPropagationInterceptor,拦截器的前置处理方法会绑定上游传递过来的xid

 

有了xid,下游分支事务需要向TC服务注册,并向TC报告分支状态,

1.Xa注册

ConnectionProxyXA

 

2.AT

3.TCC

4.SAGA

 

Seata-Server(TC)

TC作为协调者,需要保存分支注册,汇总分支状态,通知RM提交或回滚事务。

AbstractNettyRemotingServer ,启动NettyServer ,接受消息,

这里消息处理设计Tm,Rm注册, 还有心跳的处理,以及分支提交和回滚的处理。

 

 

DefaultCoordinator

 

AbstractTCInboundHandler 全局提交请求

 

DefaultCoordinator-->  DefaultCore.commit 然后会循环提交所有存储的分支

分支事务收到请求后提交分支事务 

分享到:

专栏

类型标签

网站访问总量