一、TCC方案概述
TCC(Try-Confirm-Cancel) 是一种基于业务补偿的分布式事务解决方案,通过将事务拆分为 预留资源(Try) 、确认提交(Confirm) 和 补偿回滚(Cancel) 三个阶段,实现分布式事务的最终一致性。与传统的两阶段提交(2PC)相比,TCC更适用于高并发和长事务场景,能显著减少资源锁定时间。
二、TCC核心原理
TCC通过 业务逻辑显式管理事务状态,替代数据库层面的锁机制,其核心流程如下:
1. Try阶段(预留资源)
• 目标:检查业务约束并预留资源。 • 操作: • 冻结库存、预扣账户余额等。 • 记录事务日志(用于故障恢复)。 • 特点:Try操作需保证幂等性,避免重复预留资源。
2. Confirm阶段(提交事务)
• 目标:确认执行最终业务操作。 • 操作: • 实际扣减库存、完成转账等。 • 清理Try阶段的预留资源。 • 特点:Confirm操作必须幂等,允许重试。
3. Cancel阶段(补偿回滚)
• 目标:回滚Try阶段的预留资源。 • 操作: • 解冻库存、返还预扣金额等。 • 清理事务日志。 • 特点:Cancel操作需具备业务可逆性。
三、TCC实现的关键技术
1. 幂等性设计
• 原因:网络重试或故障恢复可能导致重复调用Try/Confirm/Cancel。 • 实现: • 为每个事务分配唯一ID(如UUID),操作前检查状态。 • 数据库唯一索引或Redis原子操作防重复。
2. 事务日志与状态机
• 事务日志:记录事务ID、当前状态(Try/Confirm/Cancel)、操作时间。 • 状态机:驱动事务状态流转(如Try→Confirm或Try→Cancel)。 • 存储方案: • 本地事务表(与业务数据同库,保证原子性)。 • 独立的事务协调服务(如Seata的TC模块)。
3. 超时与重试机制
• 超时控制:为每个阶段设置超时阈值,超时后触发Cancel。 • 重试策略: • 指数退避重试(避免雪崩)。 • 死信队列处理最终失败事务。
4. 最终一致性保障
• 异步恢复:定时任务扫描悬挂事务(如Try成功但未Confirm/Cancel)。 • 人工兜底:极端情况下(如日志丢失)手动修复数据。
四、TCC最佳实践示例:电商下单场景
场景描述
用户下单涉及三个服务:
- 库存服务:扣减商品库存。
- 订单服务:创建订单记录。
- 优惠券服务:核销用户优惠券。
TCC接口设计
| 服务 | Try操作 | Confirm操作 | Cancel操作 |
|---|---|---|---|
| 库存服务 | 冻结库存(freezeStock) | 扣减库存(deductStock) | 解冻库存(unfreezeStock) |
| 订单服务 | 创建预订单(preCreate) | 确认订单(confirmOrder) | 删除预订单(cancelOrder) |
| 优惠券服务 | 锁定优惠券(lockCoupon) | 核销优惠券(useCoupon) | 解锁优惠券(unlockCoupon) |
执行流程
-
Try阶段:
// 事务协调器调用各服务的Try接口 inventoryService.freezeStock(orderId, productId, quantity); orderService.preCreate(orderId, userId, items); couponService.lockCoupon(orderId, couponId); -
Confirm阶段(全部Try成功):
inventoryService.deductStock(orderId); orderService.confirmOrder(orderId); couponService.useCoupon(orderId); -
Cancel阶段(任一Try失败):
inventoryService.unfreezeStock(orderId); orderService.cancelOrder(orderId); couponService.unlockCoupon(orderId);
异常处理示例
• Case 1:Confirm阶段订单服务宕机 • 处理:事务协调器重试confirmOrder,因接口幂等,重复调用无副作用。
• Case 2:网络分区导致Cancel未送达库存服务 • 处理:定时任务扫描日志,重新触发unfreezeStock。
五、TCC的优缺点
优点
• 减少锁竞争:资源仅在Try阶段短暂锁定。 • 高可用性:无中心化协调器单点故障。 • 适应长事务:支持跨服务的长周期业务流程。
缺点
• 业务侵入性高:需改造服务接口,实现Try/Confirm/Cancel。 • 补偿逻辑复杂:需设计逆向操作,对业务可逆性要求高。 • 最终一致性:短暂不一致窗口需业务容忍。
六、TCC vs Saga模式
| 特性 | TCC | Saga |
|---|---|---|
| 一致性模型 | 最终一致性 | 最终一致性 |
| 实现方式 | 业务补偿(Try-Confirm-Cancel) | 事件驱动+补偿事务 |
| 资源锁定 | Try阶段短暂锁定 | 无锁定,直接提交 |
| 适用场景 | 短事务、高并发 | 长事务、跨系统 |
| 复杂度 | 高(需设计三阶段接口) | 中(需编排事件与补偿) |
七、TCC框架推荐
- Seata(阿里开源) • 支持AT、TCC、Saga模式。 • 提供事务协调器(TC)和客户端SDK。
- ByteTCC(GitHub开源) • 基于Spring Cloud的TCC实现。 • 集成Hystrix熔断与Feign调用。
- ServiceComb(华为开源) • 支持TCC和Saga。 • 提供可视化事务监控。
八、总结
TCC通过 业务预留与补偿机制 替代传统事务锁,适用于需要最终一致性的高并发场景,但需付出较高的改造成本。最佳实践建议: • 业务分析:识别可补偿的操作,优先改造核心服务。 • 幂等保障:所有接口必须支持幂等调用。 • 监控与恢复:建设事务日志监控和自动恢复系统。
通过合理设计,TCC能有效平衡分布式系统的一致性与性能,成为微服务架构下处理复杂事务的重要工具。