Seata的AT模式的执行流程

238 阅读2分钟

微服务项目中经常出现一个服务调用另一个服务的情况,在每个服务内部可以通过@Transactional注解实现事务保证数据的一致性,但是微服务因为用到了不同的数据库,是无法像单体项目那样直接开启事务的,这时候需要用到一款开源的分布式事务框架:Seata。

Seata的主要实现逻辑就是找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。在Seata的事务管理中有三个重要的角色:

  • TC ( Transaction Coordinator ) - 事务协调者: 维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器: 定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器: 管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

Seata支持四种不同的分布式事务解决方案:XA、TCC、AT、SAGA。其中AT模式使用最为广泛,该模式的工作架构如图所示: image.png

AT模式的执行流程是分阶段的,流程如下:

第一阶段:

  1. TM开启并注册全局事务到TC
  2. TM调用分支事务;
  3. 分支事务准备执行业务SQL;
  4. RM拦截业务SQL,根据where条件查询原始数据,形成快照,存储数据至undolog表中;
  5. RM执行业务SQL,提交本地事务,释放数据库锁;
  6. RM报告本地事务状态给TC

第二阶段:

  1. TM通知TC事务结束;
  2. TC检查分支事务状态:
    1. 如果都成功,则立即删除undolog表中的数据;
    2. 如果有分支事务失败,需要回滚,则读取undolog表,将数据还原回分支事务执行之前。

AT模式的特点:

  1. 分支事务执行后立马提交,释放数据库连接资源,性能较高;
  2. 因为分支事务执行后会马上提交的特点,因此当事务回滚时,需要依赖undolog表来实现;
  3. 与XA模式的强一致性不同,AT模式是最终一致性,即只要保证最终结果正常即可。