微服务项目中经常出现一个服务调用另一个服务的情况,在每个服务内部可以通过@Transactional注解实现事务保证数据的一致性,但是微服务因为用到了不同的数据库,是无法像单体项目那样直接开启事务的,这时候需要用到一款开源的分布式事务框架:Seata。
Seata的主要实现逻辑就是找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。在Seata的事务管理中有三个重要的角色:
- TC ( Transaction Coordinator ) - 事务协调者: 维护全局和分支事务的状态,协调全局事务提交或回滚。
- TM (Transaction Manager) - 事务管理器: 定义全局事务的范围、开始全局事务、提交或回滚全局事务。
- RM (Resource Manager) - 资源管理器: 管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
Seata支持四种不同的分布式事务解决方案:XA、TCC、AT、SAGA。其中AT模式使用最为广泛,该模式的工作架构如图所示:
AT模式的执行流程是分阶段的,流程如下:
第一阶段:
TM开启并注册全局事务到TC;TM调用分支事务;- 分支事务准备执行业务SQL;
RM拦截业务SQL,根据where条件查询原始数据,形成快照,存储数据至undolog表中;RM执行业务SQL,提交本地事务,释放数据库锁;RM报告本地事务状态给TC。
第二阶段:
TM通知TC事务结束;TC检查分支事务状态:- 如果都成功,则立即删除undolog表中的数据;
- 如果有分支事务失败,需要回滚,则读取undolog表,将数据还原回分支事务执行之前。
AT模式的特点:
- 分支事务执行后立马提交,释放数据库连接资源,性能较高;
- 因为分支事务执行后会马上提交的特点,因此当事务回滚时,需要依赖undolog表来实现;
- 与XA模式的强一致性不同,AT模式是最终一致性,即只要保证最终结果正常即可。