Seata 是一个开源的分布式事务解决方案,旨在提供高性能和简单易用的分布式事务服务。AT 模式是 Seata 提供的一种无侵入式的分布式事务模式,它基于传统的本地事务来实现分布式事务,对业务代码的侵入性很小。
基本流程图:
一阶段
- TM发起并注册全局事务到TC:TM开始一个全局事务,并向TC注册该全局事务。TC生成一个全局唯一的XID。
- TM调用分支事务:TM接着会调用多个服务中的业务逻辑,这些业务逻辑可能分布在不同的微服务中,每个服务都是全局事务的一个分支。
- 分支事务准备执行业务SQL:在每个分支事务中,RM会接收到带有XID的请求,然后准备执行业务相关的SQL语句。
- RM拦截业务SQL,根据where条件查询原始数据,形成快照:在实际执行业务SQL之前,RM会拦截这些SQL操作,首先基于
WHERE子句中的条件查询当前的数据状态,并将这些数据的状态作为快照记录下来,存储在undo log中。这样做的目的是为了在需要回滚时能够恢复数据到事务开始前的状态。 - 执行业务SQL与写入undo log:RM接着执行实际的业务SQL,更新数据库。同时,将产生的undo log也写入数据库。这里的关键是保证了原子性,即要么全部成功(包括业务SQL和undo log的写入),要么全部失败。
- 分支事务完成:如果一切顺利,分支事务就会被标记为完成。此时,虽然对用户而言业务已经“完成”,但实际上整个全局事务还没有最终确定,因为还有其他分支事务可能还在进行中。
二阶段
-
TM通知TC事务结束:当所有分支事务都完成后,TM会告知TC可以决定全局事务的最终状态(提交或回滚)。
-
TC检查分支事务状态:如果所有分支事务报告成功,则TC指示各RM删除相应的undo log,并正式提交全局事务。 如果发现有任一分支事务失败,或者TM主动要求回滚,那么TC将指导所有参与的RM进行回滚操作。
流程图: