1

三阶段提交

三阶段提交(Three-phase Commit)是
浅谈二阶段提交的升级版。分为CanCommit、PreCommit、DoCommit三个阶段。

CanCommit

image.png

  1. 事务发起方发起请求调用给协调者
  2. 协调者向所有参与者节点询问是否可以提交,然后等到所有节点的响应
  3. 参与者执行判断是否可以顺利执行事务
  4. 回应YES/NO

PreCommit

根据参与者反馈的结果,协调者会有两种处理方式。如果所有参与者都返回YES,则到事务预提交阶段,如果有部分参与者返回NO,或者在超时时间内协调者没收到参与者的反馈,则到事务中断阶段。

事务预提交

image.png

  1. 协调者向所有参与者节点发出PreCommit请求
  2. 参与者执行所有的事务准备,并将Undo信息和Redo信息写入日志
  3. 参与者向协调者发送ack消息,等待协调者下一步请求

事务中断

image.png

  1. 协调者向所有参与者节点发出Abort请求
  2. 参与者中断事务
  3. 参与者向协调者发送ack消息

DoCommit

事务预提交后,进行真正的提交阶段。
image.png

  1. 协调者从“预提交状态”转换为“提交”状态,并向所有参与者节点发出Commit请求
  2. 参与者提交事务,并释放事务期间占的资源
  3. 参与者向协调者发送ack消息
  4. 协调者收到所有ack消息后,向事务方反馈完成事务信息

在这个阶段中,不管是协调者出现了问题,还是协调者和参与者之间网络 出现了故障,参与者无法接受到协调者发出的信息,在等待超时后,会自动提交,虽然避免了占用事务的阻塞,但是数据的一致性,还是依然存在的。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆