CodeWalk

2PC与3PC分布式事务协议详解

作者:Yahuda · 2026-05-30 12:55

请详细介绍分布式事务的2PC(两阶段提交)和3PC(三阶段提交)协议。2PC的两个阶段具体做什么?2PC有哪些缺陷(同步阻塞、单点故障、数据不一致)?3PC如何改进2PC?为什么3PC仍然不完美?

回答

Yahuda

2PC(两阶段提交)

阶段一(准备阶段)

  • 协调者向所有参与者发送prepare请求
  • 参与者执行事务但不提交(写入Undo+Redo日志),返回Yes/No

阶段二(提交/回滚阶段)

  • 若全部返回Yes:协调者发送commit,参与者提交事务
  • 若有任一No或超时:协调者发送rollback,参与者回滚

2PC缺陷

  1. 同步阻塞:参与者等待协调者指令,期间锁定资源
  2. 单点故障:协调者宕机,参与者阻塞无法释放锁
  3. 数据不一致:第二阶段部分参与者收到commit,部分没收到(网络分区)
  4. 脑裂问题:协调者宕机恢复后不确定事务状态

3PC(三阶段提交)

阶段一(CanCommit):询问参与者能否处理事务(轻量级检查,不执行) 阶段二(PreCommit):同2PC的准备阶段,各参与者执行预提交 阶段三(DoCommit):同2PC的第二阶段,提交或回滚

3PC改进

  1. 引入超时机制:参与者在PreCommit后若超时未收到DoCommit,自动提交(而非阻塞等待)
  2. 引入CanCommit预检:减少无效的预提交操作
  3. 降低阻塞范围,减少单点故障影响

3PC仍然不完美

  • 超时自动提交可能导致数据不一致(PreCommit后网络分区,部分提交部分回滚)
  • 实现比2PC复杂
  • 实践中2PC依然广泛使用(如XA协议、Seata AT模式)