分布式系统专题第五章-3PC

Posted by Ethan Blog on February 5, 2022

三阶段提交协议(3PC)主要是为了解决两阶段提交协议的阻塞问题,2pc存在的问题是当协调者崩溃时,参与者不能做出最后的选择。因此参与者可能在协调者恢复之前保持阻塞。三阶段提交(Three-phase commit),是二阶段提交(2PC)的改进版本。

与两阶段提交不同的是,三阶段提交有两个改动点。

  • 1、 引入超时机制。同时在协调者和参与者中都引入超时机制。
  • 2、 在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

    除了引入超时机制之外,3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有CanCommitPreCommitDoCommit三个阶段。

CanCommit阶段

之前2PC的一阶段是本地事务执行结束后,最后不Commit,等其它服务都执行结束并返回Yes,由协调者发生commit才真正执行commit。而这里的CanCommit指的是 尝试获取数据库锁 如果可以,就返回Yes。 这阶段主要分为2步 cap

1、事务询问

协调者参与者 发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待 参与者 的响应。

2、响应反馈

参与者 接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态。否则反馈No

PreCommit阶段

在阶段一中,如果所有的参与者都返回Yes的话,那么就会进入PreCommit阶段进行事务预提交。这里的PreCommit阶段 跟上面的第一阶段是差不多的,只不过这里协调者和参与者都引入了超时机制 (2PC中只有协调者可以超时,参与者没有超时机制)。

DoCommit阶段

这里跟2pc的阶段二是差不多的。

2PC和3PC的区别是什么

  • 3pc比2pc多了一个can commit阶段,减少了不必要的资源浪费。因为2pc在第一阶段会占用资源,而3pc在第一阶段不占用资源,只是校验一下sql,如果不能执行,就直接返回,减少了资源占用。
  • 引入超时机制。同时在协调者和参与者中都引入超时机制。

    2pc:只有协调者有超时机制,超时后,发送回滚指令。 3pc:协调者和参与者都有超时机制。 协调者超时: can commit,pre commit中,如果收不到参与者的反馈,则协调者向参与者发送中断指令。 参与者超时: pre commit阶段,参与者进行中断; do commit阶段,参与者进行提交。