2pc与3pc

2PC

2PC即二阶段提交,他将事务分为两个阶段处理,执行流程如下:

阶段一:提交事务请求

  1. 事务询问。
    协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者响应。
  2. 执行事务。
    各参与者节点执行事务操作,并将Undo和Redo信息记入事务日志中。
  3. 参与者向各协调者反馈事务询问的响应。
    如果参与者成功执行了事务操作,那么给协调者yes响应,否则返回no

这一阶段也被称为投票阶段,即参与者们投票表明是否要继续执行接下来的事务。

阶段二:执行事务提交

阶段二中,协调者会根据参与者的反馈情况决定是否提交事务,有以下两种情况。

执行“事务提交”

如果参与者的反馈都是yes,那么会执行事务提交。

  1. 发送提交请求。
    协调者向所有参与者发出commit请求。
  2. 事务提交。
    参与者接受commit请求后会正式执行事务,并在提交完成之后释放在整个事务执行期间占用的事务资源。
  3. 反馈事务提交结果。
    参与者在完成事务后,想协调者发送ack消息。
  4. 完成事务。
    协调者接受到所有参与者的ack消息,完成事务。
事务中断

假如任何一个参与者向协调者返回no响应,或在等待超时之后,协调者尚无法接受到所有参与者的反馈响应,那么事务就会中断。

  1. 发送回滚请求
    协调者向所有参与者发送Rollback请求。
  2. 事务回滚
    参与者接收到Rollback请求后,会利用其在阶段一中记录的Undo信息实行事务回滚,回滚完成后释放整个事务执行期间占用的资源。
  3. 反馈事务回滚结果
    参与者在完成事务回滚后,向协调者发送ack消息。
  4. 中断事务。
    协调者接受到所有事务反馈的ack消息后,完成事务中断。
2PC“事务提交”示意图

阶段一

Prepare请求
Prepare请求
yes
yes
协调者
参与者1
参与者2

阶段二

Commit请求
Commit请求
Ack
Ack
协调者
参与者1
参与者2
2PC“事务中断”示意图

阶段一

Prepare请求
Prepare请求
yes
no
协调者
参与者1
参与者2

阶段二

Rollback请求
Rollback请求
Ack
Ack
协调者
参与者1
参与者2

优缺点

优点:原理简单,实现方便。
缺点:同步阻塞、单点问题、脑裂、太过保守。

3PC

针对2PC的一些问题,研究者在二阶段提交协议的基础上进行了改进,提出了三阶段提交协议。协议设计如下图所示。

协调者 参与者 阶段一 canCommit? Yes 阶段二 preCommit? Yes 阶段三 doCommit? haveCommitted 协调者 参与者

阶段一:CanCommit

  1. 事务询问。
    协调者向所有的参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
  2. 参与者在接收到来自协调者的canCommit请求后,反馈yes或no响应。

阶段二:PreCommit

包含以下两种可能

执行事务预提交

假如协调者都返回yes响应

  1. 发送预提交请求
    协调者向所有参与者发出preCommit的请求,并进入Prepared阶段。
  2. 事务预提交
    参与者接收到preCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中。
  3. 各参与者向协调者反馈事务执行响应。
    如果参与者成功执行了事务操作,那么就会反馈给协调者Ack响应,同时等待最终的指令啊:commit或abort。
中断事务

假如协调者返回了no响应,或超时,或无反馈

  1. 发送中断请求。
    协调者向所有参与节点发出abort请求。
  2. 中断事务。
    无论是收到来自协调者的abort请求,或者是在等待协调者请求过程中出现超时,参与者都会中断事务。

阶段三:doCommit

包含以下两种可能

执行提交
  1. 发送提交请求
    进入这一阶段,假设协调者处于正常工作状态,并且它接收到了来自所有参与者的Ack响应,那么它将从“预提交”状态转换到“提交”状态,并向所有参与者发送doCommit请求。
  2. 事务提交
    参与者接收到doCommit请求后,会正式执行提交操作,并在完成提交之后释放在整个事务执行期间占用的事务资源。
  3. 反馈事务提交结果。
    参与者完成事务提交之后,向协调者发送Ack消息。
  4. 完成事务。
    协调者接受到所有参与者与反馈的Ack消息后,完成事务。
中断事务
  1. 发送中断请求。
    协调者向所有的参与者节点发送abort请求。
  2. 事务回滚。
    参与者接收到abort请求后,执行回滚。
  3. 反馈事务回滚结果。
    参与者在完成事务回滚后,向协调者发送Ack消息。
  4. 中断事务
    协调者接收到所有参与者的Ack消息后,中断事务。

需要注意的是,一旦进入阶段三,可能存在以下两种故障。

  • 协调者出现问题。
  • 协调者和参与者之间的网络出现故障。

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

优缺点

优点:相对二阶段提交,降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致。
缺点:三阶段提交协议去除阻塞的同时也引入了新的问题,那就是在参与者接收到preCommit消息后,如果出现网络分区,该参与者依然会进行事务提交,这必然出现数据的不一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值