分布式事务解决方案之3PC

Posted by Liao on 2023-03-10

一、定义

3PC,Three-phase commit protocol,解决了2PC的阻塞问题,分为3个阶段canCommit,preCommit,doCommit

二、3PC过程

1、阶段一 CanCommit

(1)事务询问:TC向各个Participants发送CanCommit,询问是否可以执行事务提交操作,并开始等待Participants的响应。

(2)反馈询问响应:Participants收到CanCommit请求后,如果任务自身可以完成事务则返回YES,否则返回NO

2、阶段二 PreCommit

  • 执行PreCommit: 如果TC收到Participants反馈全为YES,则执行PreCommit(事务预提交)

    • TC向所有Participants发送PreCommit请求,进入Prepared阶段
    • Participants收到PreCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中。
    • Participants向TC反馈事务执行响应:如果Participants都成功执行了事务,则给反馈给TCACK响应。
  • 中断事务:如果任何一个Participants反馈为NO,或者等待超时后,TC无法收到所有Participants的反馈,则会中断事务

    • 发送中断请求:TC向所有Participants发送Abort请求。
    • 中断事务:无论收到Abort请求,还是等待超时,Participants都要中断事务。

3、阶段三 DoCommit

  • 执行DoCommit:若TC接收到所有Participants的ACK响应,则实行DoCommit

    • 发送DoCommit请求:如果TC正常工作,接收到所有Participants的ACK响应,则从Prepared阶段进入提交阶段,并向所有Participants发送DoCommit消息。
    • 事务提交:所有Participants收到DoCommit请求后,正式提交事务,并在完成事务后释放占用的资源。
    • 反馈事务提交结果:所有Participants完成事务提交后,向TC发送ACK响应。
    • 完成事务:TC接收到所有Participants的ACK响应后,完成事务。
  • 中断事务:假设TC正常工作,并且有任何一个Participants反馈NO,或者等待超时后无法接收所有Participants的反馈,则会中断事务

    • 发送中断请求:TC向所有Participants节点发送Abort请求
    • 事务回滚:Participants接收到Abort请求后,利用Undo日志执行事务回滚,并在事务回滚完成后释放所占用的资源
    • 反馈事务回滚结果:Participants完成事务回滚后,向TC发送ACK消息。
    • 中断事务:TC接收到所有Participants的ACK消息后,执行中断事务操作。

三、3PC优缺点

  • 优点:降低2PC中Participants的阻塞范围,并能够在出现单点故障后继续达成一致
  • 缺陷:仍然有数据不一致的问题,如网络分区情况下,TC发送完PreCommit消息后突然两个机房断开,这时候TC所在的机房会发送Abort,剩余的机房里则会发送Commit