三阶段提交(3PC - Three - Phase Commit)
-
定义和工作原理
- 3PC 是在 2PC 的基础上进行改进的分布式事务协议,主要是为了减少 2PC 中的阻塞问题和单点故障风险。它分为三个阶段:
- CanCommit 阶段:事务协调者向所有参与者发送一个 CanCommit 请求,询问参与者是否可以提交事务。参与者接收到请求后,根据自身的状态(如资源是否充足、本地事务是否能够执行等)返回 Yes 或 No 响应。这个阶段主要是初步检查参与者是否有能力执行事务,并不涉及事务的实际执行和资源预留。
- PreCommit 阶段:如果协调者收到所有参与者的 Yes 响应,就会进入 PreCommit 阶段。协调者向参与者发送 PreCommit 请求,要求参与者执行事务操作,但与 2PC 不同的是,此时参与者并不立即提交事务,而是和 2PC 的准备阶段一样,执行事务操作并记录 Redo 和 Undo 信息,然后向协调者返回 ACK 响应。如果协调者收到任何一个参与者的 No 响应,就会向所有参与者发送 abort 请求,要求参与者回滚事务,整个事务流程结束。
- DoCommit 阶段:当协调者收到所有参与者在 PreCommit 阶段返回的 ACK 响应后,就会向参与者发送 DoCommit 请求,要求参与者提交事务。参与者收到请求后正式提交事务,释放资源。如果协调者在规定时间内没有收到所有参与者的 ACK 响应,或者在发送 DoCommit 请求后没有收到参与者的提交成功反馈,协调者会重新发送 DoCommit 请求或者判定事务失败并要求参与者回滚事务。
- 3PC 是在 2PC 的基础上进行改进的分布式事务协议,主要是为了减少 2PC 中的阻塞问题和单点故障风险。它分为三个阶段:
-
与 2PC 的区别
在协调者和参与者中都引入了超时机制(2PC只有协调者才有超时机制),并且把2PC的第一个阶段拆分成了两步(询问 & 执行事务操作并记录 Redo 和 Undo 信息)
-
解决阻塞问题
- 2PC:在准备阶段后,如果协调者出现故障,参与者会一直等待协调者的指令,导致事务阻塞。
- 3PC:引入了 CanCommit 阶段进行初步询问,并且在 PreCommit 阶段参与者在未收到 DoCommit 请求时可以自动回滚事务,减少了等待协调者指令导致的阻塞情况。例如,在 PreCommit 阶段,如果参与者长时间未收到 DoCommit 请求,它可以基于超时机制自行决定回滚事务,避免了长时间的资源占用。
-
降低单点故障影响
- 2PC:协调者在事务过程中扮演着至关重要的角色,一旦协调者故障,可能会导致整个事务处理陷入混乱。
- 3PC:虽然协调者仍然很重要,但由于有更多的阶段和更灵活的回滚机制,即使协调者在某个阶段出现故障,参与者可以基于当前阶段的状态进行一定程度的自我处理,降低了对协调者的依赖。例如,在 CanCommit 阶段,如果协调者故障,参与者可以简单地结束事务流程而不会产生像 2PC 中那样的阻塞。
-
提高可靠性
- 2PC:因为同步阻塞和单点故障问题,在出现网络故障或节点故障时,数据不一致的风险相对较高。
- 3PC:通过三次阶段的通信和更灵活的处理机制,在一定程度上提高了事务处理的可靠性,减少了数据不一致的可能性。例如,在 DoCommit 阶段,如果部分参与者未收到提交请求,3PC 可以通过重新发送请求或者回滚机制来尽量保证事务的一致性。
...