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模式:长事务的替代方案,将大事务拆分为多个本地事务
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号