面试题答案
一键面试1. 2PC 存在的问题
- 单点故障:在 2PC 中,协调者处于核心地位,一旦协调者发生故障,整个事务可能会陷入阻塞,参与者无法得知最终的决策结果。
- 协调者故障导致的一致性问题:若协调者在发出
commit
或rollback
指令前崩溃,部分参与者可能已执行了操作,而其他参与者未执行,导致数据不一致。
2. 3PC 解决问题的方式
- 引入预询问阶段:3PC 在 2PC 的基础上增加了预询问(CanCommit)阶段,协调者先询问参与者是否有能力和意愿执行事务,这样可以提前发现一些潜在问题,减少单点故障和协调者故障对一致性的影响。
- 引入超时机制:在 3PC 中,每个阶段都有超时机制。若参与者在规定时间内未收到协调者的指令,会根据自身状态进行相应处理,而不是像 2PC 那样一直阻塞等待,从而提高了系统的容错性。
3. 3PC 各个阶段的操作及作用
- CanCommit 阶段
- 协调者操作:协调者向所有参与者发送
CanCommit
请求,询问参与者是否可以执行事务操作。 - 参与者操作:参与者收到请求后,检查自身资源是否满足事务执行条件以及是否愿意执行事务。如果满足,返回
Yes
响应,否则返回No
响应。 - 作用:此阶段主要是试探参与者的状态,提前发现可能导致事务无法执行的问题,避免直接进入准备阶段后因部分参与者无法执行而导致的资源浪费和一致性风险。
- 协调者操作:协调者向所有参与者发送
- PreCommit 阶段
- 协调者操作:如果协调者收到所有参与者的
Yes
响应,那么向所有参与者发送PreCommit
请求,进入预提交阶段。若有任何一个参与者返回No
响应,或者在规定时间内未收到所有参与者的响应,协调者向所有参与者发送abort
请求,中断事务。 - 参与者操作:参与者收到
PreCommit
请求后,执行事务操作,但不提交事务,而是将 Undo 和 Redo 信息记录到日志中。若收到abort
请求,则中断事务。 - 作用:在确认所有参与者都有能力且愿意执行事务后,让参与者进行事务的预执行,记录日志以便后续恢复,同时给参与者一个等待最终决策的状态。
- 协调者操作:如果协调者收到所有参与者的
- DoCommit 阶段
- 协调者操作:如果协调者在 PreCommit 阶段正常收到所有参与者的
Ack
响应,那么向所有参与者发送DoCommit
请求,要求参与者正式提交事务。若在规定时间内未收到所有参与者的Ack
响应,或者有参与者返回错误信息,协调者向所有参与者发送abort
请求。 - 参与者操作:参与者收到
DoCommit
请求后,正式提交事务,并释放事务相关资源。若收到abort
请求,则回滚事务,同样释放资源。 - 作用:此阶段是事务的最终提交阶段,确保所有参与者对事务的最终状态达成一致,要么全部提交,要么全部回滚,从而保证数据的一致性。
- 协调者操作:如果协调者在 PreCommit 阶段正常收到所有参与者的