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 然后会循环提交所有存储的分支
分支事务收到请求后提交分支事务
分享到: