详解Seata的四种事务模式:AT、TCC、SAGA、XA
一、AT 模式(Auto Transaction - 默认模式)
核心原理:
基于 SQL 解析的自动补偿机制,通过代理数据源实现业务无侵入。
工作流程:
关键特性:
-
自动生成补偿:
-
前置镜像(Before Image):记录 SQL 执行前的数据状态。
-
后置镜像(After Image):记录 SQL 执行后的数据状态。
/* 前置镜像 */ SELECT * FROM account WHERE id=1 FOR UPDATE;/* 业务操作 */ UPDATE account SET balance=90 WHERE id=1;/* 后置镜像 */ SELECT * FROM account WHERE id=1;
-
-
全局锁机制:
-
在 TC 中维护行级锁。
-
防止其他事务修改正在操作的数据。
-
适用场景:
-
常规业务系统(电商、CRM等)。
-
需要快速接入分布式事务的场景。
-
对业务代码无侵入要求的项目。
二、TCC 模式(Try-Confirm-Cancel)
核心原理:
人工编码的柔性事务,通过三个阶段实现最终一致性。
三阶段定义:
阶段 | 职责 | 特性 |
---|---|---|
Try | 资源预留(冻结资金、占库存) | 可失败、可重试 |
Confirm | 确认操作(实际扣款、减库存) | 必须成功、幂等 |
Cancel | 取消操作(解冻资金、释库存) | 必须成功、幂等 |
工作流程:
代码实现示例:
// 账户服务接口
public interface AccountService {@TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")boolean tryDeduct(BusinessActionContext context, @BusinessActionContextParameter(paramName = "userId") String userId,@BusinessActionContextParameter(paramName = "amount") BigDecimal amount);boolean confirm(BusinessActionContext context);boolean cancel(BusinessActionContext context);
}// 实现类
@Service
public class AccountServiceImpl implements AccountService {@Transactionalpublic boolean tryDeduct(BusinessActionContext context, String userId, BigDecimal amount) {// 检查余额// 冻结资金(生成冻结记录)accountDao.freeze(userId, amount);}public boolean confirm(BusinessActionContext context) {// 获取冻结金额BigDecimal amount = (BigDecimal)context.getActionContext("amount");// 实际扣除冻结资金accountDao.deductFrozen(userId, amount);}public boolean cancel(BusinessActionContext context) {// 释放冻结资金accountDao.unfreeze(userId, amount);}
}
设计要点:
-
幂等控制:
-
通过事务上下文(XID + Branch ID)确保操作幂等。
-
-
空回滚防护:
-
检查 Try 是否已执行。
-
-
悬挂处理:
-
Cancel 比 Try 先到时拒绝执行。
-
适用场景:
-
金融支付系统。
-
需要精准控制事务流程的业务。
-
高并发资金操作(如红包系统)。
三、SAGA 模式
核心原理:
长事务解决方案,通过事务编排 + 补偿服务实现最终一致性
两种实现方式:
类型 | 实现方式 | 特点 |
---|---|---|
状态机 | 基于配置的状态转移 | 可视化编排、集中管理 |
注解驱动 | @SagaService 注解 | 代码集成、灵活性高 |
状态机配置示例:
{"name": "orderSaga","steps": [{"name": "reduceInventory","service": "inventoryService","compensate": "compensateInventory"},{"name": "deductBalance","service": "accountService","compensate": "compensateDeduction"}],"failurePolicy": "forward" // 补偿策略
}
补偿策略:
策略 | 执行方式 | 适用场景 |
---|---|---|
正向恢复 | 重试失败步骤 | 临时性错误(网络抖动) |
逆向恢复 | 执行所有补偿操作 | 业务逻辑错误 |
自定义策略 | 根据错误类型选择策略 | 复杂业务场景 |
工作流程:
适用场景:
-
跨系统业务流程(订单→物流→支付)。
-
长时间运行的事务(保险理赔、贷款审批)。
-
遗留系统改造(不需要全局事务支持)。
四、XA 模式
核心原理:
基于数据库原生XA协议,实现强一致性分布式事务。
两阶段提交:
阶段 | 操作 | 资源状态 |
---|---|---|
Prepare | 所有参与者执行事务但不提交 | 锁定资源 |
Commit | 协调者通知所有参与者提交事务 | 释放锁,持久化 |
代码示例:
@GlobalTransactional(type = GlobalTransactionType.XA)
public void xaTransaction() {jdbcTemplateXA1.execute("UPDATE account SET balance=90 WHERE id=1");jdbcTemplateXA2.execute("INSERT INTO log(user_id,action) VALUES(1,'payment')");
}
关键配置:
# 启用XA模式
seata.data-source-proxy-mode=XA
# 超时设置(秒)
seata.tx-service.xa.timeout=30
适用场景:
-
传统数据库迁移到分布式架构。
-
需要强一致性的核心系统(银行核心)。
-
已有支持XA协议的数据库系统。
五、模式选择决策树
六、混合模式实战案例
电商订单系统:
-
主流事务(AT模式):
@GlobalTransactional public void createOrder(OrderDTO order) {// AT模式操作inventoryService.deductStock(order); accountService.deductBalance(order);// TCC模式操作(积分服务)pointsService.addPoints(order.getUserId(), order.getPoints());// 本地事务orderDAO.create(order); }
-
积分服务(TCC模式):
@TwoPhaseBusinessAction(name = "addPoints") public boolean tryAddPoints(BusinessActionContext context, @BusinessActionContextParameter("userId") Long userId,@BusinessActionContextParameter("points") Integer points) {// 预加积分(生成预加记录) }
七、性能对比
指标 | AT模式 | TCC模式 | SAGA模式 | XA模式 |
---|---|---|---|---|
吞吐量 | 10,000 TPS | 8,000 TPS | 7,000 TPS | 2,000 TPS |
平均延迟 | 50ms | 80ms | 100ms+ | 200ms+ |
锁持有时间 | 极短(本地提交后释放) | 中等(Confirm前) | 长(整个事务周期) | 长(两阶段结束) |
数据一致性 | 最终一致 | 最终一致 | 最终一致 | 强一致 |
业务侵入性 | 无 | 高 | 中 | 无 |
八、选型建议
-
首选 AT 模式:
-
新项目快速接入
-
常规业务场景
-
开发资源有限的项目
-
-
考虑 TCC 模式:
-
金融核心系统
-
需要精确控制事务流程
-
高并发资金操作
-
-
选择 SAGA 模式:
-
跨企业服务调用
-
长周期业务流程
-
遗留系统集成
-
-
使用 XA 模式:
-
强一致性要求的系统
-
已有XA基础设施
-
数据库支持XA协议
-
重要提示:生产环境建议结合 Sentinel 或 Hystrix 实现事务熔断,防止雪崩效应。对于金融级场景,建议采用 TCC+AT 混合模式,关键资金操作使用TCC,辅助操作使用AT。