2PC和3PC

2022-04-02  本文已影响0人  九楼记

2PC

两阶段提交又称2PC,2PC是一个非常经典的强一致、中心化的原子提交协议

中心化是指协议中有两类节点:一个是中心化协调者节点(coordinator)和N个参与者节点(partcipant)。

两个阶段:

举例订单服务A,需要调用支付服务B去支付,支付成功则处理购物订单为待发货状态,否则就需要将购物订单处理为失败状态。

第一个阶段:投票阶段

  1. 事务询问:协调者向参与者发送预处理请求,称之为prepare阶段,并开始等待参与者的响应;

  2. 执行本地事务:各个参与者节点执行本地事务操作,但在执行完成后并不会真正提交数据库本地事务,而是先向协调者报告说:“我这边可以处理了/我这边不能处理”。

  3. 参与者向协调者反馈:如果参与者成功执行了事务操作,那么就反馈给协调者Yes响应,表示事务可以执行,如果没有参与者成功执行事务,那么就反馈给协调者No响应,表示事务不可以执行。

第二个阶段:提交/执行阶段(成功流程)

  1. 所有的参与者反馈给协调者的信息都是Yes,那么就会执行事务提交。协调者所有参与者节点发出Commit请求;

  2. 事务提交:参与者收到Commit请求之后,就会正式执行本地事务Commit操作,并在完成提交之后释放整个事务执行期间占用的事务资源。

第二个阶段:提交/执行阶段(异常流程)

  1. 有任何一个参与者向协调者反馈NO,则协调者向所有参与者节点发出RoollBack请求;

  2. 事务回滚:参与者接收到RoollBack请求后,会回滚本地事务。

2PC缺点

  1. 性能问题

无论是在第一阶段的过程中,还是在第二阶段,所有的参与者资源和协调者资源都是被锁住的,只有当所有节点准备完毕,事务协调者才会通知进行全局提交,

参与者进行本地事务提交后才会释放资源。这样的过程会比较漫长,对性能影响比较大

  1. 丢失消息导致的数据不一致问题

数据不一致。当执行事务提交过程中,如果协调者向所有参与者发送Commit请求后,发生局部网络异常或者协调者在尚未发送完Commit请求,即出现崩溃,最终导致只有部分参与者收到、执行请求。于是整个系统将会出现数据不一致的情形;

  1. 单节点故障由于协调者的重要性

一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(虽然协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)

3PC

三阶段提交协议(3PC)主要是为了解决两阶段提交协议的阻塞问题,2pc存在的问题是当协作者崩溃时,参与者不能做出最后的选择。

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

1、引入超时机制。同时在协调者和参与者中都引入超时机制。

2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

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

3PC比2PC好在哪里?

Reference

[1] https://www.jianshu.com/p/b6c2f0f8c789

[2] https://learnku.com/articles/38659

上一篇下一篇

猜你喜欢

热点阅读