二段式提交协议和三段式提交协议(2PC和3PC)

2PC与3PC场景

这两者是常用解决分布式事物的方式,保证在分布式事物中要么都提交事物,要么都取消事物。

二段式提交(2PC)

主要有两个阶段:

准备阶段
提交阶段
主要步骤如下:
4. 步骤一,协调者询问参与者是否可以提交。
5. 步骤二,参与者告知提交者可以提交。
6. 步骤三,协调者让参与者发送提交请求。
7. 步骤四,参与者提交完毕后告知协调者已经提交完毕。


二段式提交的问题
在上面步骤三中,如果协调者发送提交请求给了一半的参与者之后就出了问题,那么就会出现有长时间阻塞的情况。

打个比方,上图中参与者2和3收到了提交请求,但是4和5没有收到提交请求,这时候4和5就会进入阻塞状态,等待协调者恢复后发送提交请求给它。

如果在很长时间后协调者还是没有发送提交请求给它,那么会认为协调者无法恢复,会重新选出一个协调者来进行事物提交。
在这种极端差的情况下,2和3已经提交的事物是需要回滚的。

三段式提交(3PC)

三段式提交是二段式提交的改进,主要就是为了解决二段式提交长时间阻塞的问题。
实现上,主要是加入了一个“预提交阶段”。

主要有三个阶段:

准备阶段
预提交阶段(下面的步骤三和步骤四)
提交阶段
主要步骤如下:

步骤一,协调者询问参与者是否可以提交。
步骤二,参与者告知提交者可以提交。
步骤三,如果所有参与者都可以提交,协调者会将这个信息告知参与者。
步骤四,单个参与者知道所有参与者都准备完毕可以提交,向协调者发送“预提交”请求。

步骤五,协调者让参与者发送提交请求。
步骤六,参与者提交完毕后告知协调者已经提交完毕。
在三段式提交情况下,如果在预提交阶段出现了协调者宕机的情况,是不需要回滚事物的。
如果是在提交阶段出现了协调者宕机的情况,可以通过时延来自动提交。(因为可以确定其他参与者也会提交,一致性就得以保证)

两者比较
3PC与2PC相比,主要是保证了在“协调者”单点故障情况下参与者的一致性。
但是并不能保证整个系统的一致性,如果是”参与者“故障还是会存在长时间阻塞的情况。

目前3PC在实际系统中很少使用,主要原因有如下两点:

2PC中由于”协调者“单点故障出现长时阻塞的情况很少出现。
由于3PC多引入了一个阶段,因此”协调者“与”参与者“之间多了一层通讯,效率与2PC相比太低。


————————————————
版权声明:本文为CSDN博主「许佳佳233」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/double2hao/article/details/89601880

你可能感兴趣的:(项目相关)