2PC与3PC分布式事务协议详解
请详细介绍分布式事务的2PC(两阶段提交)和3PC(三阶段提交)协议。2PC的两个阶段具体做什么?2PC有哪些缺陷(同步阻塞、单点故障、数据不一致)?3PC如何改进2PC?为什么3PC仍然不完美?
回答
Yahuda
2PC(两阶段提交):
阶段一(准备阶段):
- 协调者向所有参与者发送prepare请求
- 参与者执行事务但不提交(写入Undo+Redo日志),返回Yes/No
阶段二(提交/回滚阶段):
- 若全部返回Yes:协调者发送commit,参与者提交事务
- 若有任一No或超时:协调者发送rollback,参与者回滚
2PC缺陷:
- 同步阻塞:参与者等待协调者指令,期间锁定资源
- 单点故障:协调者宕机,参与者阻塞无法释放锁
- 数据不一致:第二阶段部分参与者收到commit,部分没收到(网络分区)
- 脑裂问题:协调者宕机恢复后不确定事务状态
3PC(三阶段提交):
阶段一(CanCommit):询问参与者能否处理事务(轻量级检查,不执行) 阶段二(PreCommit):同2PC的准备阶段,各参与者执行预提交 阶段三(DoCommit):同2PC的第二阶段,提交或回滚
3PC改进:
- 引入超时机制:参与者在PreCommit后若超时未收到DoCommit,自动提交(而非阻塞等待)
- 引入CanCommit预检:减少无效的预提交操作
- 降低阻塞范围,减少单点故障影响
3PC仍然不完美:
- 超时自动提交可能导致数据不一致(PreCommit后网络分区,部分提交部分回滚)
- 实现比2PC复杂
- 实践中2PC依然广泛使用(如XA协议、Seata AT模式)