解决分布式事务的方案 —— Seata
1. 认识 Seata
解决分布式事务的方案有很多,但实现起来都比较复杂,因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在 2019 年开源的 Seata 了。
Seata 的事务管理中有三个重要的角色:
- TC(Transaction Coordinator)事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚,相当于监控中心。
- TM(Transaction Manager)事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
- RM(Resource Manager)资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
2. 微服务集成 Seata
引入依赖
<!-- seata -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
修改配置
seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.101.68:8848 # nacos地址namespace: "" # namespace,默认为空group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUPapplication: seata-server # seata服务名称tx-service-group: hmall # 事务组名称service:vgroup-mapping: # 事务组与tc集群的映射关系hmall: "default"
3. Seata 工作模式
Seata 支持四种不同的分布式事务解决方案,Seata 默认使用的是 AT 模式:
- AT
- XA
- TCC
- SAGA
这四种方案可以满足 CP 和 AP 的需求,比如:XA 可以实现 CP 即强一致性,AT 可以实现 AP 最终一致性,四种模式中 AT 模式使用较多,本课程重点讲解AT模式。
3.1 AT 模式
工作流程图

流程说明:
- TM 通知 TC 开启全局事务,TC 记录全局事务状态;
- TM 调用所有 RM,开始执行分支事务,然后 RM 向 TC 注册分支事务;
- RM 执行自己的 sql 并进行提交,同时记录日志到 undolog 表中;
- RM 向 TC 汇报自己事务执行的状态;
- TM 通知 TC,提交或回滚全局全局事务。TC 汇总所有 RM 的事务执行情况,并通知所有 RM 执行提交或回滚操作
- 提交:删除 undolog 表中的日志
- 回滚:RM 根据各自 undolog 表中的日志,反向操作,操作成功后删除 undolog 中的日志
3.2 XA 模式
工作流程图

流程说明:
- TM 通知 TC 开启全局事务,TC 记录全局事务状态;
- TM 通知所有 RM,开始执行分支事务,然后 RM 向 TC 注册分支事务;
- RM 执行自己的 sql,然后向 TC 报告自己执行的事务状态;
- TM 通知 TC,提交或回滚全局事务。TM 汇总所有 RM 分支的事务状态,并通知所有 RM 执行提交或回滚的操作。
可见,AT 模式使用起来更加简单,无业务侵入,性能更好。因此企业 90% 的分布式事务都可以用 AT 模式来解决。
3.3 TCC 模式
工作流程图

流程:
- TM 通知 TC 开启全局事务,TC 记录全局事务状态;
- TM 通知 RM 执行分支事务,RM 向 TC 注册分支事务;
- RM 对将要操作的资源进行检测和预留,将要执行的资源单独分出来,并向 TC 汇报所执行的事务状态;
- TM 通知 TC,提交或回滚全局事务。TC 统计汇总所有 RM 分支事务状态,并通知所有 RM 执行提交或回滚的操作
- 提交:RM 执行 Congirm 操作,真正执行数据
- 回滚:RM 执行 cancel 操作,将隔离出来的资源返回
TCC 模式的每个阶段是做什么的?
- Try:资源检查和预留
- Confirm:业务执行和提交
- Cancel:预留资源的释放
3.4 SAGA 模式
工作流程图

流程:
- TM 通知 TC 开启全局事务,TC 记录全局事务;
- TM 通知所有 RM 执行分支事务,RM 向 TC 注册分支事务;
- RM 执行自己的 sql 业务,并向 TC 汇报分支事务执行的状态;
- TM 通知 TC 提交或回滚全局事务。TC 汇总所有 RM 的事务状态,并通知所有 RM 执行提交或回滚
- 提交:RM 执行提交操作
- 回滚:RM 通过回滚机制和补偿机制进行回滚操作。
4. 小结
4.1 Seata 是怎么进行分布式事务控制的?
使用 Seata 的 AT 模式,AT 模式的底层使用的是 CAP 的 CP,保证数据的最终一致性。
4.2 Seata 的工作原理?
首先,Seata 是一个专门用于处理分布式事务的开源框架,它通过定义全局事务和分支事务的概念来实现分布式事务的控制,并支持多种模式,如 AT 模式、TCC 模式、SAGA 模式等。
核心概念:
- 事务协调器(TC):维护全局事务和分支事务的状态,并驱动全局事务的提交或回滚。
- 事务管理器(TM):定义全局事务的边界,即开始和结束全局事务。
- 资源管理器(RM):管理分支事务并报告分支事务的状态给 TC,同时也负责分支事务的提交或回滚。
工作原理:
- 开始全局事务:TM 通知 TC 开启一个全局事务,TC 生成一个全局唯一的 XID 用于标识这个全局事务。
- 执行分支事务:TM 通知 RM 执行分支事务,执行完成后向 TC 报告分支事务的状态。
- 提交或回滚全局事务:
- 当所有分支事务都成功完成,TM 通知 TC 提交全局事务,TC 随后指示各个 RM 提交对应的分支事务。
- 如果任何一个分支事务失败,TM 会通知 TC 回滚全局事务,TC 会指令各 RM 回滚各自的分支事务。
分布式事务模式
- AT 模式:一种无侵入式的分布式事务解决方案,基于数据库的 ACID 特性,自动完成数据的快照和补偿操作,适合对业务代码侵入性要求较低的场景。
- TCC 模式:需要业务系统提供 Try、Confirm、Cancel 三个方法接口,适用于对一致性要求较高且能够接受一定程度业务侵入的场景。
- SAGA 模式:长事务解决方案,适用于长时间运行的业务流程,通过一系列子事务及其补偿操作来保证最终一致性。
通过上述机制,Seata 实现了对分布式事务的有效管理和控制,也能够保证事务的一致性和可靠性。