Seata有三个组成部分:

事务协调者TC:协调者

事务管理器TM:发起方

资源管理器RM:参与方

发起方会协调者申请一个全局事务id,并保存到ThreadLocal中(为什么要保存到ThreadLocal中?弱引用,线程之间不会发生数据冲突)

Seata数据源代理发起方和参与方的数据源,将前置镜像和后置镜像写入到undo_log表中,方便后期回滚使用。

发起方获取全局事务id,通过改写feign客户端请求头传入全局事务id。

参与方从请求头中获取全局事务id保存到ThreadLocal中,并把该分支注册到SeataServer中。

如果没有出现异常,发起方会通知协调者,协调者通知所有分支,通过全局事务id和本地事务id删除undo_log数据,如果出现异常,通过undo_log逆向生成sql语句并执行,然后删除undo_log语句。如果处理业务逻辑代码超时,也会回滚。