TC(Transaction Coordinator): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚;
TM(Transaction Manager): 事务管理器,控制全局事务的边界,并最终发起全局提交或者回滚的决议;
RM(Resource Manager): 资源管理器,负责分支注册, 状态汇报,驱动分支事务的提交和回滚。
seata分布式事务的执行过程:
1、A服务的TM向TC申请开启一个全局事务,用来管理所有的分支事务,驱动回滚或提交。TC会创建一个全局事务并且返回一个唯一的XID.
2、A服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务中进行管辖。这就会有一个管辖的关系,如果一个分支事务出错我都可以通过TC通知到每一个分支事务并且让他们回滚。
3、A服务执行分支事务,向数据库做操作。
4、A服务开始远程调用B服务,此时XID会在微服务的一个调用链上进行传播。
5、B服务RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖。(注意,每一个微服务的RM在执行前都会先往TC注册一下分支服务,并纳入XID对应的管辖,这就保证了全局微服务事务的回滚提交一致性)
6、B服务执行分支事务,向数据库做操作
7、全局事务调用链执行完毕,TM根据有无异常向TC发起全局事务的提交或者回滚。
8、TC协调管辖之下的所有事务,决定是否会滚。
TM只是用来看是否有异常,有的话就提出回滚,最终决定和协调的还是TC。RM是各个微服务的事务,用来和资源交互,以及出现问题后提交。他是直接和数据库交互的东西。
Seata的整体机制:
整体分为两个阶段:
一阶段: 业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和链接资源。
二阶段:提交异步化,非常快速的完成。
回滚通过一阶段的回滚日志进行反向补偿。
一阶段:
在一阶段,seata会拦截业务的sql,
1、解析sql语义,找到sql要更新的业务数据,在数据更新前,拍一个快照,将其保存下来,称为前快照。
2、执行sql语句
3、保存sql执行后的数据,将其保存为后快照,并最后生成行锁。
以上操作全在一个数据库事务中完成,保证了一阶段操作的原子性。