三阶段提交协议(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之后,如果出现网络分区,那么该参与者节点会继续执行事务的提交,而其他节点会执行中断事务,最终会造成数据的不一致。