面试题答案
一键面试两阶段提交步骤及作用
- 第一阶段:准备阶段(投票阶段)
- 步骤:
- 协调者向所有参与者发送
Prepare
消息,询问它们是否可以提交事务。 - 每个参与者接收到
Prepare
消息后,执行事务操作(如更新数据等),但不提交事务。然后,参与者会检查自身执行事务操作的情况,如果一切正常,就向协调者返回Yes
响应,表示可以提交事务;如果出现问题,如磁盘空间不足、锁冲突等,就返回No
响应,表示无法提交事务。
- 协调者向所有参与者发送
- 作用:
- 此阶段主要是让协调者收集所有参与者对事务提交的可行性反馈。通过询问每个参与者,确保在真正提交事务前,所有相关的数据库节点都有能力且准备好提交事务。这样可以避免部分节点成功提交而部分节点失败的不一致情况,为整个事务的原子性提供保障。例如,如果有一个参与者返回
No
,说明事务在这个节点上出现了问题,整个事务就不能提交,从而保证了数据的一致性。
- 此阶段主要是让协调者收集所有参与者对事务提交的可行性反馈。通过询问每个参与者,确保在真正提交事务前,所有相关的数据库节点都有能力且准备好提交事务。这样可以避免部分节点成功提交而部分节点失败的不一致情况,为整个事务的原子性提供保障。例如,如果有一个参与者返回
- 步骤:
- 第二阶段:提交阶段(执行阶段)
- 当所有参与者都返回
Yes
响应时(成功情况):- 步骤:
- 协调者接收到所有参与者的
Yes
响应后,向所有参与者发送Commit
消息。 - 每个参与者接收到
Commit
消息后,正式提交事务,并释放事务过程中占用的资源(如锁等)。提交完成后,向协调者发送Ack
确认消息,表示事务已成功提交。
- 协调者接收到所有参与者的
- 作用:
- 协调者发送
Commit
消息是通知所有参与者可以将之前准备阶段执行的事务操作持久化到数据库中。参与者提交事务并释放资源,完成整个事务的处理,使得所有节点的数据状态达成一致,确保了事务的原子性。比如在一个跨多个数据库节点的转账操作中,所有涉及的节点都提交事务后,转账操作才算真正完成,资金状态在各个节点都保持一致。
- 协调者发送
- 步骤:
- 当有任何一个参与者返回
No
响应时(失败情况):- 步骤:
- 协调者接收到
No
响应后,向所有参与者发送Rollback
消息。 - 每个参与者接收到
Rollback
消息后,回滚事务,撤销准备阶段执行的所有操作,并释放事务过程中占用的资源。回滚完成后,向协调者发送Ack
确认消息,表示事务已成功回滚。
- 协调者接收到
- 作用:
- 当有参与者无法提交事务时,协调者发送
Rollback
消息保证所有节点的数据状态恢复到事务开始前的状态,避免因部分节点提交而部分节点未提交导致的数据不一致。例如在一个订单创建及库存扣减的分布式事务中,如果库存扣减节点出现问题返回No
,其他节点回滚事务后,订单状态不会变为已创建,库存也不会被错误扣减,保证了数据的一致性和完整性。
- 当有参与者无法提交事务时,协调者发送
- 步骤:
- 当所有参与者都返回