面试题答案
一键面试二阶段提交(2PC)协议工作原理
- 第一阶段:准备阶段(投票阶段)
- 协调者向所有参与者发送事务内容,询问是否可以执行事务提交操作,并等待各参与者的响应。
- 参与者接收到请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中,但不真正提交事务。
- 然后参与者向协调者反馈事务执行的结果,如果事务执行成功,反馈“同意”;如果事务执行失败,反馈“中止”。
- 第二阶段:提交阶段(执行阶段)
- 情况一:所有参与者都反馈“同意”
- 协调者接收到所有参与者的“同意”反馈后,向所有参与者发送“提交”指令。
- 参与者接收到“提交”指令后,正式提交事务,完成数据持久化,并释放事务处理过程中占用的资源。
- 情况二:有任何一个参与者反馈“中止”或者等待超时
- 协调者向所有参与者发送“回滚”指令。
- 参与者接收到“回滚”指令后,利用之前记录的Undo信息回滚事务,撤销之前执行的操作,并释放资源。
- 情况一:所有参与者都反馈“同意”
二阶段提交(2PC)协议局限性
- 单点故障问题
- 协调者是整个2PC协议的核心,如果协调者发生故障,整个分布式事务无法继续进行。例如,在准备阶段协调者故障,参与者会一直等待协调者的后续指令,造成资源浪费和事务阻塞。在提交阶段协调者故障,部分参与者可能已经提交事务,而部分可能还未收到提交指令,导致数据不一致。
- 同步阻塞问题
- 在整个2PC过程中,参与者在等待协调者指令期间,会锁定资源并处于阻塞状态。比如在准备阶段,参与者执行完事务操作后,一直等待协调者的提交或回滚指令,期间无法处理其他事务,这会严重影响系统的并发性能。
- 数据不一致问题
- 当协调者向参与者发送提交指令后,部分参与者成功提交事务,而另一部分由于网络问题等未收到指令未能提交,就会出现数据不一致。例如,在一个分布式转账场景中,A账户扣款成功提交事务,而B账户收款却因未收到提交指令未完成入账,导致数据不一致。
- 性能问题
- 2PC协议需要协调者与参与者之间多次交互,网络开销较大。同时,由于同步阻塞的存在,在高并发场景下,系统整体性能会受到严重影响。比如在电商的高并发订单处理场景中,大量事务因2PC的同步阻塞和网络交互开销,导致响应时间变长,用户体验变差。