Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源的分布式事务解决方案,主要支持AT、TCC、SAGA和XA四种模式。以下是各模式的工作原理:
1. AT模式(自动补偿型)
核心思想:基于本地事务的扩展,通过代理数据源实现分支事务的自动提交和回滚。
工作流程:
- 阶段一(执行):
- 主事务发起全局事务,生成
XID(全局事务ID)。 - 分支事务执行SQL时,Seata拦截SQL生成前置镜像(before image)和后置镜像(after image),保存到
undo_log表。 - 本地事务提交,但全局事务未提交时,数据处于“中间状态”(其他事务不可见)。
- 主事务发起全局事务,生成
- 阶段二(提交/回滚):
- 提交:删除
undo_log记录,释放锁。 - 回滚:根据
undo_log的前置镜像恢复数据。
- 提交:删除
特点:
- 对业务代码零侵入,依赖数据库本地事务。
- 适合大多数CRUD场景,但需要支持本地ACID事务的数据库(如MySQL)。
2. TCC模式(手动补偿型)
核心思想:将事务拆分为Try-Confirm-Cancel三个阶段,由开发者手动实现补偿逻辑。
工作流程:
- Try:预留资源(如冻结账户余额)。
- Confirm:确认执行业务(如扣减冻结金额)。
- Cancel:取消操作并释放资源(如解冻金额)。
特点:
- 需要业务代码显式实现补偿接口,灵活性高。
- 适合需要强一致性的场景(如金融系统),但开发复杂度较高。
3. SAGA模式(长事务补偿)
核心思想:将长事务拆分为多个本地事务,每个事务提交后触发下一个事务,失败时逆向补偿。
工作流程:
- 事务执行顺序由状态机定义。
- 成功时顺序执行,失败时逆向调用已提交事务的补偿接口。
特点:
- 无锁设计,适合长流程业务(如订单+库存+物流)。
- 补偿逻辑需幂等,可能存在“脏写”问题(最终一致性)。
4. XA模式(强一致性)
核心思想:基于数据库的XA协议,由事务管理器协调多个资源管理器(RM)实现两阶段提交。
工作流程:
- 阶段一(Prepare):所有RM执行事务但不提交,返回就绪状态。
- 阶段二(Commit/Rollback):根据协调者指令提交或回滚。
特点:
- 强一致性,但性能较低(依赖数据库XA支持)。
- 适合传统数据库集成场景(如Oracle、MySQL InnoDB)。
对比总结
| 模式 | 一致性 | 侵入性 | 适用场景 |
|---|---|---|---|
| AT | 最终 | 无 | 常规CRUD |
| TCC | 强 | 高 | 金融、高一致性需求 |
| SAGA | 最终 | 中 | 长流程、异步业务 |
| XA | 强 | 无 | 传统数据库XA支持的环境 |
选择建议:根据业务对一致性、性能和开发成本的需求权衡选择模式。
一、如何选择事务模式?(决策矩阵)
| 模式 | 适用场景 | 慎用场景 |
|---|---|---|
| AT | - 常规CRUD(如更新订单+扣库存) - 对一致性要求最终即可 - 希望零侵入业务代码 - 数据库支持本地事务(MySQL、PostgreSQL等) | - 高频热点数据(锁竞争激烈) - 不支持本地事务的数据库(如MongoDB) |
| TCC | - 金融核心系统(转账、支付) - 需要强一致性 - 涉及非数据库操作(如Redis、MQ) - 业务能接受手动实现补偿逻辑 | - 补偿逻辑复杂的业务 - 快速迭代项目(开发成本高) |
| SAGA | - 长流程业务(订单创建→物流→结算) - 子事务执行时间长 - 需要异步化/并行执行 - 能接受最终一致性(补偿需幂等) | - 无法设计幂等补偿的场景 |
| XA | - 传统数据库(Oracle、MySQL InnoDB) - 已有系统支持XA协议 - 强一致性且能接受性能损耗 | - 高频事务(性能要求高) - 云原生数据库(部分不支持XA) |
二、默认模式:AT模式
- 原因:
Seata设计以AT模式为默认核心,因其:- 零业务侵入(无需改代码,通过代理数据源自动生效)。
- 适用大部分场景(80%的CRUD操作)。
- 自动生成回滚日志(
undo_log),简化开发。
- 生效条件:
引入Seata依赖后不显式配置事务模式时,默认启用AT模式。
三、指定模式的方法
在微服务中指定模式分为 全局配置 和 单方法配置:
1. 全局配置(所有服务默认模式)
在 application.yml 中指定:
yamlCopy Code
seata: enabled: true data-source-proxy-mode: AT # 可选 AT / XA (代理数据源模式) client: support: # 声明全局默认模式 (AT/TCC/SAGA/XA) seataHandlerClass: io.seata.tm.api.defaultimpl.DefaultGlobalTransaction
2. 单方法配置(精细控制)
在业务方法上通过注解指定:
javaCopy Code
// AT模式(默认无需注解,显式声明可选) @GlobalTransactional // 默认使用AT模式 // TCC模式 @GlobalTransactional(type = GlobalTransactionType.TCC) // SAGA模式 @GlobalTransactional(type = GlobalTransactionType.SAGA) // XA模式 @GlobalTransactional(type = GlobalTransactionType.XA)
四、混合使用建议
复杂系统可组合不同模式:
- 核心支付链路:用
TCC保证强一致。 - 订单创建流程:用
SAGA编排库存、优惠券等异步服务。 - 普通查询更新:用默认
AT降低开发成本。 - 传统数据库操作:用
XA兼容存量系统。
⚠️ 关键原则:
- 强一致性:优先选 TCC/XA。
- 开发效率:无特殊要求默认用AT。
- 长事务:SAGA是唯一选择。
- 性能瓶颈:避免XA高频场景,TCC需优化预留资源逻辑。
通过全局配置+注解的灵活组合,可在同一系统中适配不同业务场景的事务需求。
1430

被折叠的 条评论
为什么被折叠?



