2阶段提交(2PC)

一、2PC基本概念

2PC(Two-Phase Commit,两阶段提交)是分布式系统中保证事务原子性的经典协议,它通过协调者(Coordinator)和参与者(Participant)的交互,

确保所有节点要么全部提交事务,要么全部回滚事务


1、两个阶段分别为:

  • 准备阶段

  • 提交阶段


2、参与的角色:

  • 协调者(Coordinator):事务的发起者和决策者,负责控制整个提交过程

  • 参与者(Participant):事务的执行者


二、协议的两个阶段


第一阶段:准备阶段(投票阶段)

1、协调者发送准备请求:协调者向所有参与者发送Prepare消息

2、参与者执行事务:每个参与者执行事务操作但不提交,将undo/redo信息写入日志

3、参与者响应准备结果:

  • 如果事务执行成功:返回YES投票

  • 如果事务执行失败:返回NO投票


这是两阶段的第一段,这一阶段只是准备阶段,由事务的协调者发起询问参与者是否可以提交事务,但是这一阶段并未提交事务,流程图如下图:


第二阶段:提交阶段(执行阶段)


根据第一阶段的投票结果:


情况1:所有参与者都返回YES

1、协调者发送COMMIT请求

2、参与者收到后完成事务提交

3、参与者向协调者发送ACK确认

4、协调者收到所有ACK后完成事务


情况2:任一参与者返回NO或超时未响应

1、协调者发送ROLLBACK请求

2、参与者收到后执行事务回滚

3、参与者向协调者发送ACK确认

4、协调者收到所有ACK后中断事务


三、二阶段事务均正常提交的完整流程如下图:


举个百米赛跑的例子来具体描述下2PC的流程:学校运动会,有三个同学,分别是A,B,C,2PC流程如下:

  • 裁判:A同学准备好了吗?准备进入第一赛道....

  • 裁判:B同学准备好了吗?准备进入第一赛道....

  • 裁判:C同学准备好了吗?准备进入第一赛道....

  • 如果有任意一个同学没准备好,则裁判下达回滚指令

  • 如果裁判收到了所有同学的 OK 回复,则再次下令跑......

  • 裁判:1,2,3 跑............

  • A同学冲刺到终点,汇报给裁判

  • B,C同学冲刺失败,汇报给裁判


四、2PC的优点

  • 强一致性:保证所有节点数据状态一致

  • 简单易懂:协议流程清晰明确

  • 广泛支持:多数关系数据库都实现了2PC


五、2PC的缺点

  • 同步阻塞:参与者需要等待其他节点的响应,期间资源被锁定

  • 单点问题:协调者故障会导致系统阻塞

  • 数据不一致风险:

    • 第二阶段协调者发送COMMIT后崩溃,部分参与者可能收不到提交指令

    • 网络分区可能导致部分节点提交而其他节点未提交

  • 保守性:任一节点失败都会导致整个事务回滚


六、2PC的容错处理


协调者故障

1、准备阶段故障:可以安全中止事务

2、提交阶段故障:

  • 参与者处于"准备就绪"状态:必须等待协调者恢复

  • 需要引入超时机制和持久化日志


参与者故障

1、准备阶段故障:协调者收不到响应,超时后中止事务

2、提交阶段故障:协调者必须不断重试直到收到ACK


七、2PC的变种与优化


1、3PC(三阶段提交):增加预提交阶段,减少阻塞时间


2、Paxos Commit:基于Paxos算法的高容错实现


3、Saga模式:长事务的替代方案,将大事务拆分为多个本地事务

posted @ 2025-04-18 20:20  jock_javaEE  阅读(119)  评论(0)    收藏  举报