MST

星途 面试题库

面试题:分布式系统下高并发场景中,数据库事务回滚机制对ACID原子性的挑战及应对

在分布式系统面临高并发读写请求时,数据库事务回滚机制会遇到哪些影响ACID原子性的问题?阐述常见的应对策略以及其原理,比如两阶段提交、三阶段提交在其中起到的作用。
37.9万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

面临影响ACID原子性的问题

  1. 网络分区:在分布式系统中,网络可能出现分区,导致部分节点与其他节点失去联系。若此时进行事务操作,处于不同分区的节点可能对事务的状态认知不一致,使得部分节点执行了事务操作,而其他节点未执行,破坏原子性。例如,在电商分布式系统中,订单创建事务涉及库存扣减和订单记录插入,若在操作过程中发生网络分区,库存扣减的节点与记录订单的节点失去联系,可能出现库存扣减成功但订单未记录的情况。
  2. 节点故障:某个参与事务的节点突然发生故障,可能导致事务无法正常完成。如果故障节点在事务执行过程中已经完成了部分操作,而其他节点不知道该故障节点的操作状态,就无法保证整个事务要么全部成功,要么全部失败,从而破坏原子性。比如,在分布式银行转账系统中,若负责扣除转出账户金额的节点故障,而接收账户金额增加的操作未开始,就会导致转账事务不完整。

常见应对策略及原理

  1. 两阶段提交(2PC)
    • 原理
      • 第一阶段(投票阶段):协调者向所有参与者发送事务内容,询问是否可以执行事务操作,并等待所有参与者响应。每个参与者评估自身能否执行该事务,如果可以则回复同意,否则回复不同意。
      • 第二阶段(提交/回滚阶段):若所有参与者都回复同意,协调者向所有参与者发送提交事务的指令,参与者收到指令后执行事务提交;若有任何一个参与者回复不同意,协调者向所有参与者发送回滚事务的指令,参与者收到指令后执行事务回滚。例如,在分布式订单系统中,第一阶段协调者询问库存服务、订单服务等各参与者能否处理订单事务,第二阶段根据投票结果统一指挥提交或回滚。
    • 作用:通过协调者统一指挥,保证所有参与者对事务的最终提交或回滚达成一致,从而维护原子性。所有节点要么都提交事务,要么都回滚事务。
  2. 三阶段提交(3PC)
    • 原理
      • 第一阶段(CanCommit阶段):协调者向参与者发送CanCommit请求,询问参与者是否可以执行事务操作,参与者根据自身情况回复Yes或No。
      • 第二阶段(PreCommit阶段):如果所有参与者都回复Yes,协调者向参与者发送PreCommit请求,参与者收到后将事务操作进行预处理(如记录日志等),但不真正提交,然后回复Ack给协调者;若有参与者回复No,协调者发送Abort请求,参与者回滚事务。
      • 第三阶段(DoCommit阶段):协调者在收到所有参与者的Ack后,发送DoCommit请求,参与者收到后正式提交事务;若协调者在规定时间内未收到所有Ack或自身出现故障,参与者根据超时机制进行事务提交或回滚(默认提交)。
    • 作用:相比2PC,3PC增加了预处理阶段,减少了协调者单点故障导致数据不一致的风险。在PreCommit阶段,即使协调者故障,参与者也可根据超时机制进行相对合理的操作,进一步保证事务原子性。例如在复杂的分布式金融交易系统中,3PC能更好应对各种异常情况,确保交易要么全部完成,要么全部撤销。