https://www.cnblogs.com/jian0110/p/14925087.html
https://www.cnblogs.com/jian0110/p/14762509.html
- AP: Application 表示应用程序
- RM: Resource Manager 资源管理器,比如数据库
- TM: Transaction Manager 表示事务管理器,协调事务和管理资源,类似于Spring的Transaction Manager。
一、AT模式介绍
同样地,还是得先复习下分布式事务的相关理论部分:AT模式是Seata最主推的分布式事务且基于XA演进而来的解决方案,主要有三个角色:TM、RM和TC,其中TM和RM作为Seata的客户端和业务集成,TC作为Seata服务器独立部署。TM向TC注册一个全局事务,并生成全局唯一的XID;在AT模式下,数据库资源被当做RM,访问RM时,Seata会对请求进行拦截;每个本地事务提交时,RM会向TC(Transaction Coordinator,事务协调器)注册一个分支事务。
从三个角色TM、RM和TC的角度来记录具体的流程的话,可以总结如下:
- TM向TC注册全局事务,并生成全局唯一XID;
- RM向TC注册分支事务,并将其纳入到该XID对应的全局事务范围。
- RM向TC汇报资源的准备状态
- TC汇总所有事务参与者的执行状态,决定分布式事务全部回滚还是提交
- TC通知所有的RM提交/回滚事务
从具体的微服务角度总结,假设分别有三个:MicroService-1, MicroService-2, MicroService-3,流程图如下:
二、Seata AT模式的实现原理
1. AT模式的第一阶段实现
解析业务SQL,更新业务数据,保存更新前后镜像到undo_log。在业务操作数据库流程中,Seata会基于数据源代理(0.9以后支持自动代理)对原执行SQL进行解析。之后通过本地事务的ACID特性,将这两步操作(保存业务数据前后镜像到undo_log, 更新业务数据)在本地事务中进行提交。
订单服务:
TM(microService):seata-order-service
RM(DB Resources):jdbc:mysql://127.0.0.1:3306/order
@GlobalTransactional // TM开启全局事务 @Transactional(rollbackFor = Exception.class)
// 这里先检查有没有库存了, 生产环境下这里是需要for update数据库锁,或者分布式锁
1.TCC补偿型方案(互联网最常用的方案)
TCC 是一种比较成熟的分布式数据一致性解决方案,实际上是把一个完整业务拆分为三个步骤:
Try:主要是数据的校验或者资源的预留;
Confirm:确认真正执行的任务,只操作Try阶段预留的资源;
Cancel:取消执行,释放Try阶段预留的资源。
其实TCC是2PC的思想,第一阶段通过Try进行准备工作,第二阶段Confirm/Cancel表示Try阶段操作的确认和回滚。