一架梯子,一头程序猿,仰望星空!
分布式事务面试题 > 内容正文

什么是2PC协议?3PC协议又是什么?


问题简答

2PC协议是指二阶段提交协议,它是一种用于在分布式系统中实现事务的协议。分布式事务的原子性是指要么所有参与事务的节点都成功完成,要么所有节点都回滚到事务开始前的状态,不能出现部分节点成功、部分节点失败的情况。

问题详解:

1.2PC协议

二阶段提交(Two-phase Commit,即2PC),该协议的主要思想是通过两个阶段的提交来保证原子性。

2PC协议分为两个阶段:

1.1.准备阶段(第一阶段)

事务的协调者(coordinator)向所有参与者(participants)发送请求,询问它们是否可以执行事务操作。

1.2.提交执行阶段(第二阶段)

如果所有参与者都可以执行事务操作,那么协调者会向所有参与者发送“提交”命令。如果有任何一个参与者无法执行事务操作,那么协调者会向所有参与者发送“回滚”命令,要求它们回滚到事务开始前的状态。

提示:2PC协议,非常类似平时大家使用的MYSQL本地事务(单个数据库),begin(第一阶段)、commit/rollback(第二阶段),区别就是2PC协议可以用在多个数据库之间的事务。

2.示意图

下面是UML时序图,描述2PC协议的过程。

2PC协议

3.2PC缺点

3.1.性能较差

在2PC协议中,所有参与者都需要等待协调者的指令才能进行提交操作,导致整个事务的执行时间较长,影响系统的性能。

3.2.单点故障

如果协调者发生故障,整个事务都将无法执行,导致系统不可用。

3.3.阻塞问题

如果某个参与者长时间无法响应或者未能收到协调者的响应,那么它会一直处于等待状态,从而导致整个事务被阻塞,无法正常执行。

4.3PC协议

三阶段提交协议(Three-Phase Commit, 3PC),它是对2PC协议的改进。与2PC协议相比,3PC协议在保证分布式事务的原子性的同时,尽可能地减少了阻塞和数据不一致的问题。

3PC协议与2PC协议最大的不同在于,它引入了“超时机制”来解决协调者故障的问题。具体来说,3PC协议将2PC协议的“准备阶段”拆分成了“询问阶段”和“准备阶段”,并在协调者和参与者之间增加了“超时”机制,从而避免了协调者长时间无响应的情况。

下面是3PC协议的三个阶段:

  1. 询问阶段(CanCommit):协调者向所有参与者发送“CanCommit”请求,询问它们是否可以提交事务。如果一个参与者无法响应,或者在规定时间内未能响应,则协调者会假定它不能提交事务。
  2. 准备阶段(PreCommit):只有在所有参与者都已经确认可以提交事务时,协调者才会发送“PreCommit”请求,要求参与者进行“预提交”操作。在这个阶段,参与者会执行一些准备工作,但是并不会真正提交事务。
  3. 提交阶段(DoCommit):如果所有参与者都成功完成了准备工作,则协调者会发送“DoCommit”请求,要求参与者正式提交事务。否则,协调者会发送“DoAbort”请求,要求参与者回滚事务。

5.3PC协议的缺点

5.1. 实现复杂

3PC协议相对于2PC协议而言,引入了询问阶段,增加了实现的复杂度,需要更多的代码和资源来实现。

5.2. 性能仍有瓶颈

虽然3PC协议通过引入超时机制避免了阻塞的问题,但是由于仍然需要进行三个阶段的提交,其性能仍然存在瓶颈,无法满足高并发的需求。

5.3. 存在脑裂问题

由于3PC协议仍然是一种基于主从架构的协议,因此在面对网络分区等问题时,仍然存在脑裂的问题,可能导致数据不一致等问题。