一致性协议之 3PC

为了弥补二阶段提交的缺点,研究人员又提出了三阶段提交。3PC,全称 “three phase commit”,其将 2PC 的 “提交事务请求” 过程一分为二

什么是三阶段提交

3PC 将 2PC “提交事务请求” 分成了 2 部分,总共形成了 3 个部分:

  1. CanCommit

  2. PreCommit

  3. do Commit

阶段一:Cancommit

  1. 事务询问:协调者向所有的参与者发送一个包含事务内容的请求,询问是否可以进行事务提交操作,并开始等待各参与者的响应

  2. 各参与者向协调者反馈事务询问的响应:如果参与者认为自己 可以顺利执行事务,就返回 yes,否则返回 no

阶段二:PreCommit

协调者在得到所有参与者的响应之后,会根据结果执行 2 种操作:执行事务预提交,或者中断事务

  1. 执行事务预提交分为 3 个步骤:
  • 发送预提交请求:协调者向所有参与者节点发出 PreCommit 的请求,并进入 prepared 状态

  • 事务预提交:参与者收到 preCommit 请求后,会执行事务操作,对应 2PC 中的 “执行事务”,也会有 Undo 和 Redo 信息记录到事务日志中

  • 各参与者向协调者反馈事务执行的结果:如果参与者成功执行了事务,就反馈 Ack 响应,同时等待指令:提交(commit)或终止(abort)

  1. 中断事务分为 2 个步骤
  • 发送中断请求:协调者向所有参与者节点发出 abort 请求

  • 中断事务:参与者如果收到了 abort 请求或者超时了,都会中断事务

阶段三:do Commit

该阶段做真正的提交,同样会出现两种情况

  1. 执行请求

    • 发送提交请求:进入这一阶段,如果协调者正常工作,并且接收到了所有协调者的 Ack 响应,那么协调者将从 ”预提交“ 状态变为 ”提交“ 状态,并向所有的参与者发送 do Commit 请求

    • 事务提交:参与者收到 do Commit 请求后会正式执行事务提交操作,并在完成之后释放在整个事务执行期间占用的事务资源

    • 反馈事务提交结果:参与者完成事务提交后,向协调者发送 Ack 信息

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

  2. 中断事务

    假设任意参与者反馈了 no 响应,或者超时了,就中断事务

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

    • 事务回滚:参与者收到 abort 请求后,会利用其在二阶段记录的 undo 信息来执行事务回滚操作,并在完成回滚之后释放整个事务执行期间占用的资源

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

    • 中断事务:协调者接收到所有的 Ack 信息后,中断事务

注意:一旦进入阶段三,可能出现 2 种故障:

  1. 协调者出现问题

  2. 协调者与参与者之间出现网络故障

一旦出现了任意一种情况,最终会导致参与者无法收到 doCommit 请求或者 abort 请求,针对这种情况,参与者都会在等待超时之后继续进行事务提交

总结

优点:相比较 2PC,最大的优点就是减少了阻塞并解决了单节点故障问题,因为一旦参与者无法及时收到来自协调者的信息之后,它会默认执行 commit,而不会一直处于阻塞状态

缺点:如果参与者收到了 preCommit 消息后,出现了网络故障,那么参与者等待超时后,都会进行事务的提交,这必然会出现事务不一致的问题

-----------本文结束感谢您的阅读-----------
0%