← 每日面试题 学习看板

TCC是强一致性还是最终一致性?

面试题/02架构设计题/02分布式/02分布式事务/TCC是强一致性还是最终一致性?.md

面试记录 2026-10-19

题目:TCC 是强一致性还是最终一致性?

难度:medium

标签:arch/distributed/transaction, distributed/tcc, distributed/flexible, difficulty/medium

评分:⭐⭐☆☆☆(2/5)

我的回答

tcc 实际上是最终一致性,因为 tcc 在执行过程中是有一定的时间的中间态的,虽然会根据错误补偿,但不能保证真正的原子性;

2PC 则是先预提交,在进行等待,每一个都执行没问题后才进行 commit 并没有中间态的存在

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察对 TCC 一致性定位的准确理解,以及它与 2PC 在中间态/隔离性上的真实差异。

知识点拆解:

  1. TCC 的一致性定位:准强一致/最终一致。Try 只是预留资源,Confirm/Cancel 可能失败,必须靠重试和幂等最终收敛,期间存在可见中间态。
  2. 2PC 的中间态:Prepare 后参与者写入 redo/undo 但未提交,持有锁等待 Commit/Rollback;协调者崩溃即进入不确定阻塞。
  3. 隔离性差异:TCC 靠业务资源冻结(如冻结余额)实现隔离;2PC 靠数据库行锁/全局锁实现隔离。
  4. TCC 三坑:空回滚(Cancel 先于 Try)、幂等(重复 Confirm/Cancel)、悬挂(Cancel 后 Try 才到)。
  5. 适用场景:核心账务、跨库、需要细粒度资源控制的场景。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. "TCC 的 Try 和 2PC 的 Prepare 有什么本质区别?"
  1. "TCC 空回滚怎么防?"
  1. "TCC 悬挂怎么防?"

第三部分:面试者参考回答

【一句话结论】

面试官您好,TCC 我一般归为准强一致、最终一致,因为它有可见中间态,而且 Confirm/Cancel 可能失败。

【三点展开】

第一,Try 只是冻结资源,比如把余额从可用转到冻结,钱还没真正扣;Confirm 才真扣,Cancel 才释放,所以中间态是存在的。

第二,它靠业务补偿最终收敛,不是数据库的原子提交,因此必须处理空回滚、幂等、悬挂三个坑。

第三,2PC 也有中间态——Prepare 之后参与者已执行但未提交、还持有锁,协调者崩溃就悬挂,所以不能说 2PC 没有中间态。

【一句边界】

当然,TCC 的隔离性靠业务自己冻结资源保证,做不到 2PC 那种数据库级隔离,业务设计不到位就会超卖。