MENU

分布式事务解决方案之三阶段提交

前言

在上一篇文章中分布式事务解决方案之二阶段提交中介绍了分布式事务的二阶段提交。接着继续介绍分布式事务三阶段提交。

3PC

3PC是在2PC阶段的改进版,将二阶段提交协议的"提交事务请求"过程一分为二。形成由CanCommitPreCommitdoCommit三个阶段组成的事务处理协议。

201913
详细提交阶段说明:

  • 阶段一:CanCommit
    • 事务询问:协调者向所有的参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
    • 各参与者向协调者反馈事务询问的响应:参与者在接收到来自协调者的canCommit请求后,正常情况下,如果其自身认为可以顺利执行事务,则反馈Yes响应,并进入预备状态,否则反馈No响应。
  • 阶段二:PreCommit(事务预提交阶段)
    • 执行事务预提交(假设协调者从所有的参与者获得反馈都是Yes响应,那么就会执行事务预提交。)
      • 发送预提交请求:协调者向所有参与者节点发出preCommit的请求,并进入Prepared阶段。
      • 事务预提交:参与者接收到preCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中。
      • 各参与者向协调者反馈事务执行的响应:如果参与者成功执行了事务操作,那么就会反馈给协调者Ack响应,同时等待最终的指令:提交(commit)或中止(abort)。
    • 中断事务(若是任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应,则中断事务)
      • 发送中断请求:协调者向所有参与者节点发出abort请求。
      • 中断事务:无论是收到来自协调者的abort请求,或者是在等待协调者请求过程中出现超时,参与者都会中断事务。
  • 阶段三:doCommit(事务提交)
    • 执行事务
      • 发送提交请求:假设协调者处于正常工作状态,并且接收到来自所有参与者的Ack响应,则它将从“预提交”状态转换到“提交”状态,向所有参与者发送doCommit请求。
      • 事务提交:参与者接收到doCommit请求后,会正式执行事务提交操作,并在完成提交之后释放在整个事务执行期间占用的事务资源。
      • 反馈事务提交结果:参与者在完成事务提交之后,向协调者发送Ack消息。
      • 完成事务:协调者接收到所有参与者反馈的Ack消息后,完成事务。
    • 中断事务(假设协调者处于正常工作状态,并且任意一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应。则中断事务)
      • 发送中断请求:协调者向所有的参与者节点发送abort请求。
      • 事务回滚:参与者接收到abort请求后,会利用其在阶段二中记录的Undo信息来执行事务回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。
      • 反馈事务回滚结果:参与者在完成事务回滚之后,向协调者发送Ack消息。
      • 中断事务:协调者接收到所有参与者反馈的Ack消息后,中断事务。

    进入阶段三,可能出现①协调者出现问题 ②协调者和参与者之间的网络出现故障。
    无论出现那种情况,参与者都无法及时接收到来自协调者的doCommit和abort请求,对于该问题,参与者都会在等待超时之后,继续进行事务提交。(会导致数据不一致性)

3PC优缺点

  • 优点:相较于二阶段提交协议,降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致。
  • 缺点:三阶段在去除阻塞的同时也引入了新问题,当参与者接收到preCommit消息后,如果网络出现分区,此时协调者所在节点和参与者无法进行正常的网络通信,在这种情况下,该参与者依然会进行事务的提交,这必然出现数据的不一致性
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码