面试题答案
一键面试2PC协议基本流程
- 准备阶段(投票阶段)
- 协调者向所有参与者发送事务执行请求,并等待参与者的响应。
- 参与者接收到请求后,执行事务操作,但不提交事务,记录undo和redo日志。然后向协调者反馈执行结果,成功返回Yes,失败返回No。
- 提交阶段(决策阶段)
- 如果协调者收到所有参与者的Yes响应,那么它向所有参与者发送提交事务的指令。参与者接收到提交指令后,正式提交事务,并释放占用的资源。
- 如果协调者收到任何一个参与者的No响应,或者在等待响应过程中部分参与者超时未响应,协调者向所有参与者发送回滚事务的指令。参与者接收到回滚指令后,利用undo日志回滚事务,并释放占用的资源。
对分布式事务性能的影响
- 同步阻塞问题
- 在整个2PC过程中,从准备阶段开始,参与者就一直持有事务资源并处于阻塞状态,直到收到协调者的最终指令。这期间,其他事务无法访问这些资源,降低了系统的并发性能。例如在一个电商系统中,用户下单时涉及库存扣减和订单生成两个分布式操作。在2PC的准备阶段,库存服务扣减库存后,一直等待协调者指令,在此期间库存资源被锁定,其他用户无法进行库存相关操作,可能导致后续订单请求等待,影响系统整体的订单处理效率。
- 单点故障问题
- 协调者是2PC的核心节点,如果协调者在准备阶段之后、提交或回滚指令发出之前发生故障,参与者将一直处于阻塞状态,无法得知最终决策,可能导致资源长时间被占用。比如在一个分布式转账场景中,协调者在接收到两个账户操作(转出和转入)的准备成功响应后,在发出提交指令前崩溃。此时,转出账户已完成资金扣除操作但等待提交确认,转入账户等待资金转入,两个账户操作都处于不确定状态,且由于协调者故障,无法继续推进事务,影响了整个转账业务的正常进行。
- 网络问题
- 协调者与参与者之间的网络通信可能出现故障。如果在提交阶段,协调者发出的提交或回滚指令部分参与者未收到,就会出现数据不一致问题。例如在一个跨地区的分布式数据库系统中,由于网络波动,部分地区的数据库节点没有收到协调者的提交指令,而其他地区节点已提交事务。这就导致不同地区的数据状态不一致,影响业务数据的准确性,如在跨地区的订单统计业务中,不同地区统计的订单数据可能出现差异。