3阶段提交(3PC)
一、3PC基本概念
三阶段提交协议,是二阶段提交协议的改进版本,三阶段提交有两个改动点:
- 
在协调者和参与者中都引入超时机制 
- 
在第一阶段和第二阶段中插入一个预提交阶段。保证了在最后提交阶段之前各参与节点的状态是一致的 
1、三个阶段分别为:
- 
CanCommit(询问阶段) 
- 
PreCommit(预提交阶段) 
- 
DoCommit(提交阶段) 
2、参与的角色:
- 
协调者(Coordinator):事务的发起者和决策者 
- 
参与者(Participant):实际执行事务的资源管理器 
二、协议的三个阶段
第一阶段:CanCommit(询问阶段)
1、协调者发送CanCommit请求:询问参与者是否具备执行条件
2、参与者预检查:
- 
检查自身状态是否正常 
- 
检查资源是否可用 
- 
检查锁能否获取 
3、参与者响应:
- 
条件满足:返回 YES 
- 
条件不满足:返回 NO 
特点:此阶段不锁定资源,只做可行性评估
CanCommit阶段流程如下图:

第二阶段:PreCommit(预提交阶段)
情况1:所有参与者返回YES
1、协调者发送PreCommit请求
2、参与者:
- 
执行事务操作但不提交 
- 
记录undo/redo日志 
- 
锁定必要资源 
3、参与者返回ACK

情况2:任一参与者返回NO或超时
1、协调者发送Abort请求
2、参与者中断事务
3、参与者返回ACK

第三阶段:DoCommit(提交阶段)
情况1:前两阶段都成功
1、协调者发送DoCommit请求
2、参与者:
- 
完成事务提交 
- 
释放锁 
3、参与者返回ACK

情况2:协调者未收到足够ACK或超时
1、发送中断请求 如果协调者处于工作状态,向所有参与者发出 abort 请求
2、事务回滚 参与者接收到abort请求之后,利用其在阶段二记录的undo Log信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
3、反馈结果 参与者完成事务回滚之后,向协调者反馈ACK消息
4、中断事务 协调者接收到参与者反馈的ACK消息之后,执行事务的中断

三、3PC相比2PC的改进
1、引入询问阶段:提前发现不可行的情况,避免资源锁定
2、增加预提交状态:使参与者有明确的中间状态
3、超时中断机制:
- 
参与者在 PreCommit(预提交阶段)超时会自动提交 
- 
参与者在 CanCommit(询问阶段)超时会自动中止 
4、降低阻塞时间:单点故障时参与者能更快恢复
四、3PC的优点
1、减少阻塞:通过预检查降低资源锁定时间
2、提高可用性:超时机制使系统在协调者故障时能继续运行
3、明确状态转换:三个阶段对应清晰的状态机
4、降低数据不一致风险:预提交状态减少了"不确定状态"的持续时间
五、3PC的缺点
1、额外网络开销:多一个阶段意味着更多通信
2、实现复杂度高:需要精确的状态管理和超时处理
3、仍可能阻塞:在 DoCommit(提交阶段)协调者故障,部分参与者可能收不到指令
4、不完美容错:网络分区时仍可能出现不一致
六、3PC的容错处理
协调者故障场景:
1、CanCommit(询问阶段)故障:参与者超时后自动中止
2、PreCommit(预提交阶段)故障:
- 
已收到PreCommit的参与者会等待超时后自动提交 
- 
未收到PreCommit的参与者会中止 
3、DoCommit(提交阶段)故障:参与者超时后自动提交
参与者故障场景:
1、CanCommit(询问阶段)故障:协调者收不到响应,中止事务
2、PreCommit(预提交阶段)故障:协调者中止事务,其他参与者回滚
3、DoCommit(提交阶段)故障:协调者重试直到收到ACK
七、三阶段事务均正常提交的完整流程如下图:

 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号