← 每日面试题 学习看板

什么是分布式事务中的三阶段提交(3PC)

面试题/02架构设计题/02分布式/02分布式事务/什么是分布式事务中的三阶段提交(3PC).md

完整讲解(权威版)

最后更新:2026-10-23 · 基于第 1 次作答

L1 · 30 秒速记

结论:3PC 在 2PC 的 Prepare/Commit 之间插入 PreCommit,让参与者在协调者失联时能按"自己走到哪一步"自主决策,从而部分解决阻塞。 关键词:CanCommit · PreCommit · DoCommit · 超时自主决策 边界:网络分区下仍会脑裂,工程上被 Seata AT / TCC / 事务消息替代。

L2 · 核心讲解

核心考点定位:能否说清 3PC 的三阶段名称,以及"预提交 + 超时"这个组合为什么能缓解阻塞、又为什么没被采用。

机制链(≥3 环):

  1. CanCommit → 参与者写本地日志并返回 Yes/No:与 2PC 的 Prepare 相同,是"表态"阶段。
  2. PreCommit → 协调者收到全部 Yes 后通知进入预提交:这是 3PC 新增的"共识基础",参与者据此判断协调者是否已决定提交。
  3. DoCommit → 协调者发出最终提交:参与者提交并释放锁。
  4. 超时自主决策 → 只到 CanCommit 就超时则回滚,已到 PreCommit 就超时则提交:这是 3PC 相对 2PC 的核心创新。

证据锚点:

对比与权衡:

方案正确性吞吐/成本失败模式适用边界
2PC强一致两次往返,锁持有到提交协调者崩溃永久阻塞数据库原生 XA、单库多表
3PC强一致(假设无分区)三次往返,延迟更高网络分区导致脑裂理论价值,几乎无生产落地
Seata AT最终一致 + 全局锁一阶段业务即提交全局锁冲突、热点行微服务本地事务协调

常见误区:

  1. 错误:3PC 只是多一次检查 → 正确:新增的是 PreCommit 阶段 + 超时自主决策机制 → 为什么:没有超时机制,多一次检查并不能解决阻塞。
  2. 错误:3PC 彻底解决了阻塞 → 正确:只解决协调者单次崩溃场景 → 为什么:网络分区下两侧决策相反,仍会不一致。
  3. 错误:3PC 没被采用是因为性能差 → 正确:性能差只是次要原因 → 为什么:主因是有 Seata AT / TCC / 事务消息等更成熟的替代方案。

适用边界:3PC 适合理解分布式共识的演进(Paxos/Raft 的思想源头),不适合直接作为业务分布式事务方案。

延伸追问(≥3)

  1. 3PC 的超时机制在什么情况下会失效?
  1. Paxos 如何解决 3PC 的分区问题?
  1. 为什么工程上要求强一致时选 TCC/XA 而不是 3PC?

面试者参考回答(400–700 字)

【结论】 面试官您好,3PC 是在 2PC 的 Prepare 和 Commit 之间插入 PreCommit 阶段,并配合参与者超时自主决策,用来缓解协调者崩溃导致的阻塞。

【三点】 第一,三个阶段是 CanCommit、PreCommit、DoCommit。CanCommit 和 2PC 的 Prepare 一样,参与者写本地日志后返回能否提交;PreCommit 是新增阶段,协调者收到全部 Yes 后通知参与者进入预提交状态,这一步建立了"大家都同意提交"的共识基础;DoCommit 是最终提交,参与者提交并释放锁。第二,3PC 的核心创新是超时机制。参与者如果只收到 CanCommit 就超时,说明协调者还没决定提交,就自主回滚;如果已经收到 PreCommit 才超时,说明协调者一定决定提交了,就自主提交。这样协调者崩溃时参与者不再无限期持有锁,2PC 的阻塞问题被部分解决。第三,3PC 仍然有解决不了的场景,最关键的是网络分区。如果协调者已发出 PreCommit 但分区让部分参与者收不到,这些参与者超时后会回滚,而协调者最终会给另一部分参与者提交,两边结果相反,出现数据不一致。所以 3PC 的前提假设是"网络最终恢复、协调者只崩溃一次",这与 CAP 中分区必然存在的事实冲突。

【边界】 当然,3PC 在工程上基本没有落地,原因不只是性能差(多一次网络往返),更关键的是已经有更成熟的替代方案:强一致用 XA 或 TCC,最终一致用 Seata AT、本地消息表、事务消息和 SAGA。3PC 的价值更多在理论上,它的"预提交建立共识"思想后来被 Paxos、Raft 继承。

面试记录 2026-10-23(第 1 次)

题目:什么是分布式事务中的三阶段提交(3PC)

难度:low

标签:arch/distributed/transaction, distributed/3pc, distributed/transaction

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

练习次数:1

我的回答

3PC其目的是想解决2PC当协调者出现不可用的时候,参与者会无限期阻塞的问题;所以做了前置一层操作判定参与者的能力;

3PC的整个过程是,先做准备,这个阶段不阻塞,每个参与者检查自己的执行能力如果没问题就上报给协调者,大家都确定没问题,就进行下一个阶段,有存在问题的就结束事务;

然后是各个参与者执行自身的事务部分,然后上报结果给到协调者,如果都没问题就则协调者发送下一阶段操作,大家进行提交,如果有存在问题的参与者,那么协调者就发送通知让所有服务回滚;第三阶段就是全部提交或者回滚整个分布式事务;

其中在第三阶段如果协调者出现问题无法访问无法返回结果,参与者会等待一段时间后自行回滚,考虑的方向是在检查阶段大家已经同步过一轮事务执行应该是没问题的,这是3PC对比2PC做的最大的改进,也是一个祸乱之根,因为可能出现不一致,毕竟大家不知道其他参与者真实情况,导致事务不一致;

与2PC相比3PC增加了一轮预检查,以及在协调者无法工作时的自提交,预检查期望是提升自提交的可行性,因为已经检查过大概率是没问题的,但是还是引入了不确定性,所以3PC很少有使用

点评

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

优点:

不足:

补充:

完整讲解见上方「完整讲解(权威版)」