文章目录
Seata作为一款开源的分布式事务解决方案,提供了多种事务模式以适应不同的业务场景。以下是Seata支持的四种主要分布式事务模式的详细说明:
1. AT模式(自动补偿型事务)
核心特点
- 无侵入性:无需业务代码改造,通过代理数据源实现
- 基于SQL解析:自动生成反向补偿SQL
- 两阶段提交:
- 第一阶段:执行业务SQL并生成undo log
- 第二阶段:异步提交或回滚补偿
实现原理
适用场景
- 常规的CRUD操作
- 希望最小化代码改造的场景
- 对性能要求不是极端苛刻的系统
2. TCC模式(Try-Confirm-Cancel)
核心特点
- 手动编码:需要实现三个接口(Try/Confirm/Cancel)
- 资源预留:Try阶段预留资源
- 最终一致性:保证事务最终完成或取消
代码示例
public interface TccActionOne {
@TwoPhaseBusinessAction(name = "TccActionOne", commitMethod = "commit", rollbackMethod = "rollback")
public boolean prepare(BusinessActionContext actionContext,
@BusinessActionContextParameter(paramName = "a") int a);
public boolean commit(BusinessActionContext actionContext);
public boolean rollback(BusinessActionContext actionContext);
}
// 实现类
@Service
public class TccActionOneImpl implements TccActionOne {
@Override
public boolean prepare(BusinessActionContext actionContext, int a) {
// 尝试预留资源
String xid = actionContext.getXid();
accountService.freezeAmount(xid, a);
return true;
}
@Override
public boolean commit(BusinessActionContext actionContext) {
// 确认操作
String xid = actionContext.getXid();
accountService.commitFreeze(xid);
return true;
}
@Override
public boolean rollback(BusinessActionContext actionContext) {
// 取消操作
String xid = actionContext.getXid();
accountService.cancelFreeze(xid);
return true;
}
}
适用场景
- 需要高一致性保证的业务(如金融交易)
- 需要自定义资源管理逻辑
- 跨系统服务调用
3. SAGA模式
核心特点
- 长事务解决方案:适合长时间运行的业务流程
- 事件驱动:通过事件协调各个服务
- 补偿机制:为每个步骤定义补偿操作
执行流程
graph LR
A[开始] --> B[服务A: 预定库存]
B --> C{成功?}
C -->|是| D[服务B: 扣减金额]
C -->|否| F[补偿A]
D --> E{成功?}
E -->|是| G[服务C: 创建订单]
E -->|否| H[补偿B --> 补偿A]
G --> I[完成]
状态机配置示例
{
"name": "purchaseOrderSaga",
"steps": [
{
"name": "reduceInventory",
"service": "inventoryService",
"compensate": "compensateInventory",
"args": ["productId", "amount"]
},
{
"name": "deductBalance",
"service": "accountService",
"compensate": "compensateBalance",
"args": ["userId", "money"]
}
]
}
适用场景
- 跨多个服务的长时间业务流程
- 不需要强一致性,接受最终一致性
- 业务流程复杂且步骤多的场景
4. XA模式
核心特点
- 标准协议:遵循X/Open XA规范
- 强一致性:所有参与者要么全部提交,要么全部回滚
- 资源锁定:在准备阶段就锁定资源
实现架构
配置示例
# 数据源配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/seata_xa?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# Seata XA模式配置
seata.tx-service-group=my_test_tx_group
seata.data-source-proxy-mode=XA
适用场景
- 需要强一致性的传统数据库应用
- 已有支持XA的数据库和资源管理器
- 短事务而非长事务场景
5. 模式对比与选型指南
特性 | AT模式 | TCC模式 | SAGA模式 | XA模式 |
---|---|---|---|---|
一致性 | 最终一致性 | 最终一致性 | 最终一致性 | 强一致性 |
隔离性 | 读未提交 | 业务自定义 | 无隔离 | 可串行化 |
侵入性 | 低 | 高 | 中 | 低 |
性能 | 中 | 较高 | 高 | 低 |
适用场景 | 常规CRUD | 金融交易 | 长流程业务 | 传统数据库应用 |
锁范围 | 全局行锁 | 业务资源锁 | 无锁 | 全局锁 |
实现复杂度 | 简单 | 复杂 | 中等 | 简单 |
6. 生产环境实践建议
-
AT模式优化:
# 调整undo log保留时间 client.undo.log.save.days=3 # 增加重试次数 client.rm.asyn.commit.retry.count=5
-
TCC模式防悬挂:
@Override public boolean commit(BusinessActionContext ctx) { if(!checkTrySuccess(ctx.getXid())) { // 记录异常日志并人工处理 return false; } // 正常提交逻辑 }
-
SAGA模式设计原则:
- 补偿操作必须幂等
- 每个步骤应有超时控制
- 建议实现可视化监控
-
XA模式注意事项:
- 避免长事务导致资源长时间锁定
- 确保所有资源管理器支持XA
- 配置合适的超时时间
7. 混合模式使用案例
在实际复杂系统中,可以组合使用多种模式:
实现说明:
- 对库存服务使用AT模式(简单扣减)
- 对支付服务使用TCC模式(需要严格一致性)
- 对物流服务使用SAGA模式(长时间流程)
8. 常见问题解决方案
-
AT模式脏读问题:
- 解决方案:
@GlobalLock
注解
@GlobalLock @GetMapping("/query") public Account query(@RequestParam String accountNo) { return accountDAO.selectByAccountNo(accountNo); }
- 解决方案:
-
TCC空回滚处理:
@Override public boolean rollback(BusinessActionContext ctx) { if(!checkTryExecuted(ctx.getXid())) { // 记录空回滚日志 return true; } // 正常回滚逻辑 }
-
SAGA补偿失败:
- 实现补偿重试机制
- 提供人工干预接口
- 记录详细上下文日志
-
XA连接耗尽:
# 调整连接池大小 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5
9. 演进方向
-
Seata 2.0改进:
- 支持Redis存储事务状态
- 增强SAGA状态机可视化
- 云原生深度集成
-
Serverless适配:
# 函数计算集成示例 functions: placeOrder: handler: com.example.OrderHandler events: - http: POST /orders environment: SEATA_MODE: AT
-
多语言支持:
- 通过Sidecar模式支持非Java应用
- gRPC协议的多语言SDK
10. 总结建议
-
选型决策树:
是否需要强一致性? ├── 是 → 考虑TCC或XA └── 否 → 业务流程是否长? ├── 是 → 考虑SAGA └── 否 → 使用AT模式
-
迁移路径:
- 从本地事务 → AT模式 → 按需引入TCC/SAGA
- 逐步改造,优先在新增业务中使用分布式事务
-
监控指标:
- 各模式事务成功率
- 平均处理时间
- 资源锁定时间(XA/TCC)
- 补偿操作执行情况
Seata的多模式支持使其能够适应各种复杂的业务场景,关键在于根据业务特性选择合适的事务模式,必要时可以组合使用多种模式。在实际应用中,建议从简单的AT模式开始,随着业务复杂性的增加逐步引入其他模式。