分布式事务3PC协议

什么是3PC

Three-phase commit protocol
在计算机网络和数据库中,三阶段提交协议(3PC)是一种分布式算法,它允许分布式系统中的所有节点都同意提交事务。与2PC不同,3PC是非阻塞的。具体来说,3PC为事务提交或中止之前所需的时间设置了上限,确保如果一个给定的事务试图通过3PC提交并持有一些资源锁,那么它将在超时后释放锁。

协议描述

在描述协议时,我们使用了与两阶段提交协议中使用的术语类似的术语。因此,我们有一个协调器(Coordinator)领导事务,一组由协调器指导的一个或多个队列。
在这里插入图片描述

  • 阶段一:CanCommit
    1.事务询问
    协调者向所有的参与者发送一个canCommit请求,询问是否可以执行事务提交操作,并开始等待参与者的响应。
    2.事务询问反馈
    各参与者向协调者反馈事务询问的响应。参与者在接收到协调者的canCommit请求后,正常情况下,如果其自身认为可以顺利执行事务,那么会反馈Yes响应,并进入预备状态,否则反馈No响应。
  • 阶段二:PreCommit
    执行事务预提交
    假如协调者从所有的参与者获得的反馈都是Yes,那么就会执行事务预提交。
    1.发送预提交请求
    协调者向所有参与者节点发出preCommit请求,并进入Prepared阶段。
    2.事务预提交
    参与者接收到preCommit请求后,会执行事务操作,并将undo和redo信息记录到驶入日志中。
    3.各参与者向协调者反馈事务执行的响应
    如果参与者成功执行了事务操作,那么就会反馈给协调者Ack响应,同时等待最终的指令:提交或中止。
    中断事务
    假如任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应,那么就会中断事务。
    1.发送中断请求
    协调者向所有参与者发送abort请求。
    2.中断事务
    无论是收到来自协调者的abort请求,或者是在等待协调者请求过程中出现超时,参与者都会中断事务。
  • 阶段三:doCommit
    该阶段进行真正的事务提交。
    执行提交
    1.发送提交请求
    2.事务提交
    3.反馈事务提交结果
    4.完成事务
    中断提交
    该阶段,假设协调者处于正常工作状态,并且有任意一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者无法接收到所有参与者的反馈响应,那么就中断事务。
    1.发送中断请求
    2.事务回滚
    3.反馈事务回滚结果
    4.中断事务

优缺点

在阶段三,可能会存在两种故障:

  • 协调者出现问题
  • 协调者与参与者之间的网络出现问题

这两种情况都会最终都会导致参与者无法及时收到来自协调者的doCommit或者abort请求,针对这样的异常情况,参与者都会在等待超时之后,继续进行事务提交。

优点:相对于二阶段提交,三阶段提交的优点有:(1)降低了参与者的阻塞范围(将二阶段提交的阶段一一分为二,并引入超时中断事务机制)(2)能够在出现单点故障后继续达成一致
缺点:三阶段提交在去除阻塞的同时也引入了新的问题,那就是在参与者接收到preCommit后,如果出现网络分区(此时协调者所在的节点和部分参与者无法进行正常的网络通信),在这种情况下,一部分参与者依然会进行事务提交,另一部分参与者收到abort请求中止事务,从而造成数据的不一致。

参考:https://en.wikipedia.org/wiki/Three-phase_commit_protocol

猜你喜欢

转载自blog.csdn.net/weixin_44630798/article/details/88373678