漫谈2PC和3PC相关理论

1.概念

1.2PC

2PC是两阶段提交(two-phase commit)的简称,是一个非常经典的强一致性、中心化的原子提交协议,所以又称为两阶段提交协议(two-phase commit protocol)。所谓的中心化,是指协议中的两类节点:一个是中心化协调者节点(coordinator),另外就是N个参与者节点(partcipant)。

2.3PC

3PC是三阶段提交(three-phase commit)的简称,是2PC的改进版本,又称为三阶段提交协议(three-phase commit protocol)。与2PC不同的是,3PC有两个改动点:

  1. 引入了超时机制,特别是指在参与者中引入了超时机制
  2. 加入了一个准备阶段(Prepare),保证了最后提交之前各参与节点的状态是一致的。

2PC

1.基本原理

参与者节点将操作结果通知协调者节点,然后协调者节点根据各个参与者节点反馈的情况,来决定各个参与者节点下一步的操作(commit或者rollback).所谓的两阶段分为:准备阶段和提交阶段。

2.执行过程

1.准备阶段

  1. 协调者节点给每个参与者节点发送询问消息(即是否能够提交),然后等待各个参与者节点的响应;
  2. 各参与者节点执行事务操作,将Undo和Redo信息记入事务日志中(不做提交);
  3. 如果参与者节点执行成功,给协调者节点反馈yes,即已经准备完毕,可以提交;如果参与者节点执行失败,就给协调者节点反馈no,即不可提交。

2.提交阶段

这个阶段分为两种情况,所有参与者节点均反馈yes,或者任何一个参与者节点反馈NO及协调者超时(协调者节点长时间没有收到第一阶段的ack反馈)。

1.提交事务

此时所有的参与者节点均反馈yes:

  1. 协调者节点向所有参与者节点发出正式提交事务的请求(即Commit请求);
  2. 参与者节点执行Commit请求,并释放整个事务期间占用的资源;
  3. 各参与者节点向协调者节点反馈Ack(yes)完成的消息;
  4. 协调者节点收到所有参与者节点反馈的Ack(yes)消息后,即完成事务提交。
    漫谈2PC和3PC相关理论

2.终止事务

此时有任何一个参与者节点反馈no或者协调者在一定时间内没有收到参与者的反馈(协调者超时):

  1. 协调者向所有参与者发出回滚请求(即Rollback请求);
  2. 参与者使用阶段1中的Undo信息执行回滚操作,并释放整个事务期间占用的资源;
  3. 各参与者向协调者反馈Ack完成的消息;
  4. 协调者收到所有参与者反馈的Ack消息后,即完成事务终止。
    漫谈2PC和3PC相关理论

3.2PC的优点及缺陷

从上面的执行过程中,我们可以很容易的总结出2PC的一些优缺点,优点很明显,原理简单,方便实现,目前绝大多数的关系型数据库都是采用两阶段提交协议来完成分布式事务处理的。
当然,缺陷也比较多,主要有以下几点:
漫谈2PC和3PC相关理论

3PC

1.基本原理

3PC,三阶段提交协议,是2PC的改进版本,即将事务的提交过程分为CanCommit、PreCommit、do Commit三个阶段来进行处理。

2.执行过程

漫谈2PC和3PC相关理论

1.CanCommit

  1. 协调者节点向所有参与者节点发出包含事务内容的CanCommit请求,询问是否可以提交事务,并等待所有参与者节点答复。
  2. 参与者节点收到CanCommit请求后,如果认为可以执行事务操作,则反馈yes并进入预备状态,否则反馈no。
    漫谈2PC和3PC相关理论

2.PreCommit

这个阶段分为两种情况:

  1. 所有参与者节点均反馈yes,即执行事务预提交;
  2. 任何一个参与者节点反馈no,或者等待超时后协调者节点尚无法收到所有参与者节点的反馈,即终止事务。

1.事务预提交

此时所有的参与者节点均反馈yes。

  1. 协调者节点向所有参与者节点发出PreCommit请求,进入准备阶段;
  2. 参与者节点收到PreCommit请求后,执行事务操作,将Undo和Redo信息记入事务日志中(但不提交事务);
  3. 各参与者节点向协调者节点反馈Ack响应或No响应,并等待最终指令。

2.终止事务

此时任何一个参与者节点反馈no或者等待超时后协调者节点还没有收到所有参与者节点的反馈。

  1. 协调者节点向所有参与者节点发出abort请求;
  2. 无论收到协调者节点发出的abort请求,或者在等待协调者节点请求过程中出现超时,参与者节点均会中断事务
    漫谈2PC和3PC相关理论

3.doCommit

这个阶段也会分为两种情况:

  1. 所有参与者节点均反馈yes,即执行事务预提交;
  2. 任何一个参与者节点反馈no,或者等待超时后协调者节点尚无法收到所有参与者节点的反馈,即终止事务。

1.提交事务

此时所有参与者节点均反馈ACK(yes)响应。

  1. 协调者节点向所有参与者节点发出doCommit请求;
  2. 参与者节点收到doCommit请求后,会执行事务提交,并且释放整个事务期间占用的资源;
  3. 各参与者节点向协调者节点反馈Ack(yes)完成消息;
  4. 协调者节点收到所有参与者节点反馈的Ack(yes)消息后,即完成事务提交。

2.终止事务

任何一个参与者节点反馈no,或者等待超时后协调者节点还没有收到所有参与者节点的反馈:

  1. 协调者节点向所有参与者节点发出abort请求;
  2. 参与者节点使用PreCommit中的Undo信息执行回滚操作,并释放整个事务期间占用的资源;
  3. 各参与者节点向协调者节点反馈Ack完成的消息;
  4. 协调节点收到所有参与者节点反馈的Ack消息后,即2完成事务终止。

3.小说明

一旦参与者收到了PreCommit,意味他知道大家其实都同意修改了,所以当进入第三阶段时,由于网络超时等原因,虽然参与者没有收到commit或者abort响应,但是他有理由相信:成功提交的几率很大。

漫谈2PC和3PC相关理论

3.3PC的改进与不足

漫谈2PC和3PC相关理论

小结

2PC、3PC归根到底是选择系统可用性还是选择系统一致性(CAP理论中的抉择问题), 2PC 一致性好、可用性较低,3PC一致性较低、可用性高。