分布式事务TCC分布式事务tcc实现
💻 面试官:“聊聊分布式事务,特别是TCC模式,怎么保证数据一致性?” 这种问题在面试中越来越高频。今天我们就来拆解分布式事务的核心难点以及TCC分布式事务如何落地,让你在面试中胸有成竹!
📚 2025年Java面试宝典提前拿!
🔗 链接:https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码:9b3g (速存,面试进阶必备!)
为什么需要分布式事务?TCC分布式事务为何是优选?
单体架构下,一个数据库搞定ACID很简单。但微服务拆分后,订单服务扣库存、账户服务扣款、库存服务减库存,三个操作可能横跨三个数据库甚至不同机房!本地事务失效了,这就是分布式事务要解决的痛点。
常见方案如XA两阶段提交(2PC)依赖数据库且阻塞严重,消息队列最终一致性可能延迟太高。而TCC分布式事务(Try-Confirm-Cancel)则是一种业务补偿型方案,更适合高并发、对一致性要求高的场景。
TCC分布式事务核心思想拆解
TCC把一个大事务拆分成若干小事务(子服务),每个子服务都要实现三个核心方法:

1. Try阶段:预锁定资源
- 做什么? 检查资源、预留资源、冻结状态。比如:检查账户余额是否充足,并冻结要扣的金额(
tryReduceBalance
);检查库存是否足够,冻结对应商品数量(tryLockStock
)。
- 特性: 操作必须幂等(重试不影响结果)、可补偿(Cancel能撤销)。
- 面试点: 被问到“Try阶段失败怎么办?” 答案是:事务协调器(TM)会触发全局Cancel,调用各服务的Cancel回滚Try操作。
2. Confirm阶段:真正执行
- 做什么? Try全部成功后,执行真正的业务逻辑。比如:实际扣减冻结的金额(
confirmReduceBalance
)、实际扣减冻结的库存(confirmReduceStock
)。
- 特性: 必须保证幂等性和最终成功(TM会重试直到成功)。
- 面试点: Confirm失败会不断重试,因为此时Try的资源已经预留,必须保证最终提交。系统设计要能扛住Confirm重试。
3. Cancel阶段:回滚补偿
- 做什么? 当任一Try失败或超时,执行逆操作释放Try阶段预留的资源。比如:解冻账户冻结金额(
cancelReduceBalance
)、释放库存冻结数量(cancelLockStock
)。
- 特性: 必须幂等,可能被多次调用。
- 面试点: Cancel操作失败怎么办?必须通过告警+人工介入或异步重试机制保证最终回滚成功。这是TCC的难点之一。
TCC分布式事务工作流程 (看图秒懂)

- 事务发起: 主业务服务(OrderService)发起全局事务,通知事务协调器(TM)。
- 执行Try: TM依次调用各参与者服务(AccountService, InventoryService)的Try接口。
- Try结果:
- 全部成功: TM调用各服务的Confirm接口执行最终提交。
- 任一失败/超时: TM调用各服务的Cancel接口执行回滚补偿。
- Confirm/Cancel执行: 各参与者执行Confirm(提交)或Cancel(回滚)操作。
TCC分布式事务实现关键点与难点
-
幂等性设计 (重中之重!)
- 为什么? 网络抖动可能导致TM重复调用Try/Confirm/Cancel。
- 怎么做? 每个子事务生成唯一ID,利用数据库唯一约束、Redis SetNX或状态机判断是否已执行过。这是实现TCC分布式事务可靠性的基石。
-
空回滚 (Null Compensate)
- 场景: Try阶段超时失败,触发Cancel。但此时Try可能根本没执行(网络问题),Cancel操作要做空处理。
- 解法: 在Try接口里记录状态(如“已Try”)。Cancel时先检查状态,若没Try过,直接返回成功而不执行真实补偿逻辑。
-
防悬挂 (Anti-Suspend)
- 场景: Cancel执行完后,Try请求才到达(网络延迟)。导致Try预留的资源永远无法被Confirm或Cancel(悬挂)。
- 解法: 同样利用状态记录。Cancel执行后标记为“已Cancel”。Try接口执行时检查,若全局事务已是Cancel状态,则拒绝执行(或执行空Try)。
-
事务协调器(TM)高可用
- 为什么? TM挂了整个事务就卡住了。
- 解法: TM需集群部署,事务状态持久化到数据库或Redis,确保故障转移后能恢复事务状态。
TCC分布式事务适用场景与优缺点
- 适用: 对强一致性要求高、执行时间较短、业务模型能清晰拆分出Try/Confirm/Cancel三阶段的场景(支付、订单)。
- 优点: 性能好(无全局锁)、数据最终强一致。
- 缺点: 业务侵入性强(每个服务都要实现3个接口)、开发复杂(需处理幂等、空回滚、悬挂)、运维成本高(需监控补偿状态)。
面试加分点:如何选型TCC框架?
市面上成熟的框架能帮我们处理大部分底层逻辑(状态持久化、重试、幂等控制)。常见选择:
- Seata TCC: 阿里开源的明星项目,生态完善,文档齐全。
- ByteTCC: 轻量级,易于集成。
- Hmily: 性能优秀。
💡 想系统刷题、备战大厂面试?
面试鸭会员覆盖海量真题解析、模拟面试、项目难点剖析!
👉 通过 面试鸭返利网 mianshiyafanli.com 购买会员,立享返利25元! 高效投资自己,面试更从容。
