Seata(Simple Extensible Autonomous Transaction Architecture)是阿里开源的分布式事务解决方案,支持多种事务模式,提供一站式的事务管理能力。以下是其核心原理、模式及实践的详细解析:
一、Seata核心架构与角色
Seata 的分布式事务模型基于 TC(事务协调者)、TM(事务管理器)、RM(资源管理器) 三大角色实现:
- TC(Transaction Coordinator)
-
- 独立部署的服务端组件,维护全局事务和分支事务的状态,协调事务的提交或回滚15。
- TM(Transaction Manager)
-
- 集成在业务服务中的客户端组件,定义全局事务范围(如通过
@GlobalTransactional
注解),触发事务的提交或回滚18。
- 集成在业务服务中的客户端组件,定义全局事务范围(如通过
- RM(Resource Manager)
-
- 管理分支事务的资源(如数据库连接),向 TC 注册分支事务并上报状态,执行本地事务的提交或回滚68。
SpringCloudAlibaba分布式事务解决方案Seata实战与源码分析-上 - 爱码网
分布式事务解决方案之Seata管理-腾讯云开发者社区-腾讯云
https://juejin.cn/post/7274883755478237242
https://juejin.cn/post/7274883755478237242
二、Seata的四种事务模式
1. AT模式(Auto Transaction)
- 原理:基于二阶段提交的无侵入方案,通过代理数据源自动生成
undo_log
回滚日志。
-
- 一阶段:执行业务 SQL 前记录数据快照(
before_image
),执行后记录after_image
,提交本地事务并释放数据库锁。 - 二阶段:
- 一阶段:执行业务 SQL 前记录数据快照(
-
-
- 提交:异步删除
undo_log
。 - 回滚:通过
before_image
恢复数据,利用全局锁避免脏写。
- 提交:异步删除
-
- 特点:
-
- 无业务侵入,适合大多数场景。
- 存在脏读问题(因一阶段已提交本地事务),需通过全局锁解决并发冲突68。
2. TCC模式(Try-Confirm-Cancel) https://zhuanlan.zhihu.com/p/324623682
- 原理:业务层通过编码实现三个阶段:
-
- Try:资源预留(如冻结库存)。
- Confirm:确认提交(如扣减库存)。
- Cancel:回滚释放资源(如解冻库存)。
- 异常处理:
-
- 空回滚:通过事务控制表记录 Try 阶段状态,避免未执行 Try 直接 Cancel。
- 幂等性:通过状态字段标记分支事务执行状态。
- 悬挂问题:通过插入回滚记录防止二阶段先于 Try 执行。
- 适用场景:高性能核心系统(如金融交易)。
3. Saga模式 Seata 中封装了四种分布式事务模式,分别是: AT 模式, TCC 模式, Saga 模式, XA 模式,
- 原理:基于状态机编排长事务流程,每个节点执行本地事务,失败时触发补偿操作。
-
- 正向服务:执行业务逻辑。
- 补偿服务:逆向回滚操作(需业务编码)。
- 特点:
-
- 适合跨服务长流程业务(如订单审核链)。
- 需处理空回滚、幂等性问题,支持服务编排8。
4. XA模式
- 原理:基于数据库 XA 协议实现强一致性。
-
- 一阶段:执行但不提交本地事务。
- 二阶段:由 TC 统一提交或回滚。
- 特点:
-
- 强一致性,但性能低(因资源长期锁定)。
- 支持 MySQL、Oracle 等实现了 XA 协议的数据库。
三、Seata部署与实践
1. 部署TC服务
- 步骤:
-
- 下载并解压 Seata Server(如 1.5.2 版本)。
- 配置
registry.conf
使用 Nacos 作为注册中心。 - 配置
file.conf
设置数据库存储事务日志(需执行mysql.sql
初始化表结构)。 - 启动 Seata Server,确保微服务通过注册中心发现 TC。
2. 业务服务整合
依赖引入:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
- 配置代理数据源:确保每个微服务使用
DataSourceProxy
代理原生数据源。 - 事务注解:在全局事务入口方法添加
@GlobalTransactional
。
3. 数据库表设计
undo_log
表:用于 AT 模式的回滚日志。global_table
与branch_table
:TC 服务存储全局事务及分支事务信息。
四、优缺点对比
模式 | 优点 | 缺点 | 适用场景 |
AT | 无侵入、易集成 | 脏读、需全局锁防并发冲突 | 电商订单、库存扣减等最终一致性场景 |
TCC | 高性能、无全局锁 | 业务侵入、需处理空回滚/幂等 | 金融交易、核心系统 |
Saga | 支持长流程、服务编排 | 需编写补偿逻辑、复杂度高 | 多步骤审核、跨服务流程 |
XA | 强一致性、无脏读 | 性能低、资源锁定时间长 | 银行转账等强一致性需求 |
五、常见问题与解决方案
- AT模式脏写
-
- 全局锁机制:通过
lock_table
记录锁信息,确保并发事务串行化6。
- 全局锁机制:通过
- TCC空回滚
-
- 事务控制表:记录 Try 阶段状态,Cancel 前校验状态8。
- XA死锁
-
- 超时机制:TC 检测超时后强制回滚,释放资源6。
总结
Seata 通过灵活的四种模式(AT、TCC、Saga、XA)覆盖了分布式事务的不同需求,结合 TC 的统一协调,实现了事务的高可用与易用性。实际应用中需根据业务特性选择模式:
- 最终一致性优先选择 AT 或 TCC;
- 强一致性场景使用 XA;
- 长流程业务采用 Saga。
部署时需注意配置注册中心、数据源代理及事务表结构,并结合日志监控完善补偿机制368。