三阶段提交协议

三阶段提交协议(3PC)

三阶段提交协议是2PC的改进版,将二阶段提交协议的阶段一,即“提交事务请求”一分为二,形成了由CanCommit、PreCommit和doCommit三个阶段组成的事务处理协议。

协议说明

阶段一:CanCommit

  • 事务询问
    执行者向所有参与发送CanCommit请求,等待所有参与者的响应

  • 参与者反馈响应
    参与者节点若认为自身可以完成事务,返回Yes;反之,返回No

阶段二:PreCommit

若所有参与者反馈的结果都是Yes响应,那么进行事务预提交

  • 发送预提交请求
    协调者向所有参与者发送preCommit请求,进入Prepared阶段

  • 事务预提交
    参与者收到preCommit请求后,执行事务操作,并将Undo和Redo信息记录到事务日志中

  • 参与者反馈响应
    如果参与者执行事务完毕,那么会反馈ACk响应,并等待协调者的最终指令

若任意一个参与者反馈的结果是No响应,或者在等待超时之后,那么执行事务中断

  • 发送中断请求
    协调者向所有参与者节点发送abort请求

  • 中断事务
    参与者在接到abort请求,或者在等待超时之后,都会执行中断事务操作

阶段三:doCommit

该阶段可能存在两种情况,执行事务的提交和中断事务

若致谢者接受到所有参与的Ack响应,那么执行事务提交

  • 发送提交请求
    协调者从“预提交”状态进入“提交”状态,向素有参与者发送doCommit请求

  • 事务提交
    参与者接收到doCommit请求后,执行事务提交操作

  • 反馈事务提交结果
    在事务提交完成之后,向协调者反馈Ack消息

  • 完成事务
    协调者接收到所有参与者的Ack消息之后,完成事务

如果有任意一个参与者反馈No响应,或者在等待超时之后,执行中断事务

  • 发送中断请求
    协调者向所有参与者节点发送abort请求

  • 事务回滚
    参与者接受到abort请求后,利用阶段二记录的Undo信息来执行事务回滚操作

  • 反馈事务回滚结果
    参与者在完成事务回滚之后,向协调者反馈Ack信息

  • 中断事务
    协调者接收到所有参与者反馈的Ack消息后,中断事务

注意事项

一旦进入阶段三,可能会出现以下两种问题

  • 协调者自身故障
  • 协调者和参与者之间的网络出现故障

这两个问题都会导致参与者节点无法即使收到doCommit或者abort请求,针对这样的异常情况,参与者都会在等待超时后,继续进行事务提交。

优缺点

优点:相对于2PC,3PC最大的优点是降低了协调者与参与者之间的阻塞范围,并且能够在出现单点故障之后,继续达成一致。

缺点:在参与者接收到preCommit之后,如果出现网络分区,那么该参与者节点会继续执行事务的提交,而其他节点会执行中断事务,最终会造成数据的不一致。

猜你喜欢

转载自blog.csdn.net/pierce_liu/article/details/80427997