Seata 是一个开源的分布式事务解决方案,提供了四种事务模式:AT(自动补偿事务)、TCC(Try-Confirm-Cancel)、SAGA(长事务) 和 XA(强一致性事务)。每种模式适用于不同的业务场景,具有各自的优缺点。下面详细介绍这四种模式:
1. AT 模式(Auto Transaction)
原理
AT 模式是一种无侵入式的分布式事务解决方案,基于两阶段提交(2PC)优化而来。它通过数据快照(undo_log)实现事务回滚,适用于支持本地 ACID 事务的关系型数据库(如 MySQL)。
- 第一阶段(Prepare):
- 解析 SQL,生成
before_image
(更新前的数据快照)。 - 执行业务 SQL 并提交本地事务。
- 生成
after_image
(更新后的数据快照)和行锁。
- 解析 SQL,生成
- 第二阶段(Commit/Rollback):
- 提交:异步删除
undo_log
。 - 回滚:对比
after_image
和当前数据,若无脏写,则用before_image
恢复数据;否则需人工干预。
- 提交:异步删除
优点
- 无代码侵入,仅需
@GlobalTransactional
注解。 - 高性能,一阶段直接提交,不阻塞资源。
- 自动回滚,基于快照恢复数据。
缺点
- 最终一致性,二阶段提交是异步的。
- 依赖数据库,仅适用于关系型数据库。
- 存在脏写风险,需全局锁避免并发冲突。
适用场景
- 短事务,如订单支付、库存扣减等。
- 对性能要求高,但对强一致性要求不严格的业务。
2. TCC 模式(Try-Confirm-Cancel)
原理
TCC 模式需要手动实现三个接口:Try
(预留资源)、Confirm
(提交)、Cancel
(回滚)。适用于高并发、高一致性要求的场景。
- Try:检查并预留资源(如冻结账户余额)。
- Confirm:确认执行业务(如扣减冻结金额)。
- Cancel:释放预留资源(如解冻金额)。
优点
- 高性能,无全局锁,适用于高并发。
- 支持非关系型数据库(如 Redis、MongoDB)。
- 强一致性,业务可控性强。
缺点
- 代码侵入性强,需手动编写补偿逻辑。
- 需保证幂等性,防止重复提交或回滚。
适用场景
- 资金交易(如转账、支付)。
- 需要精确控制事务补偿的业务。
3. SAGA 模式(长事务)
原理
SAGA 模式适用于长事务,通过事件驱动的方式,将事务拆分为多个子事务,每个子事务有对应的补偿操作。适用于跨多个服务的复杂业务流程。
- 正向操作:依次执行各子事务(如创建订单、扣库存)。
- 补偿操作:若某子事务失败,则逆向执行已提交的子事务(如取消订单、回滚库存)。
优点
- 支持长事务,适用于跨多个微服务的流程。
- 异步执行,提高系统吞吐量。
缺点
- 最终一致性,存在中间状态。
- 补偿逻辑复杂,需手动实现回滚。
适用场景
- 订单+库存+物流等多步骤业务。
- 跨系统调用,如电商下单流程。
4. XA 模式(强一致性事务)
原理
XA 模式基于数据库原生 XA 协议,采用两阶段提交(2PC),确保强一致性。适用于需要严格 ACID 的场景。
- 第一阶段(Prepare):各 RM(资源管理器)执行 SQL 但不提交,锁定资源。
- 第二阶段(Commit/Rollback):TC(事务协调器)决定全局提交或回滚。
优点
- 强一致性,满足 ACID 特性。
- 无代码侵入,仅需配置 XA 数据源。
缺点
- 性能低,锁定资源时间长。
- 依赖数据库支持 XA 协议(如 MySQL、Oracle)。
适用场景
- 金融级交易,如银行转账。
- 需要严格数据一致性的业务。
模式对比
模式 | 一致性 | 性能 | 代码侵入性 | 适用场景 |
---|---|---|---|---|
AT | 最终一致 | 高 | 无 | 短事务(订单、库存) |
TCC | 强一致 | 高 | 高 | 资金交易(支付) |
SAGA | 最终一致 | 中 | 中 | 长事务(电商下单) |
XA | 强一致 | 低 | 无 | 金融交易(银行转账) |
如何选择?
- 需要无侵入? → AT 或 XA。
- 需要高性能? → AT 或 TCC。
- 长事务? → SAGA。
- 强一致性? → XA 或 TCC。