面试题答案
一键面试- 第一阶段:准备阶段(Prepare)
- 日志记录:当一个事务开始执行修改操作时,InnoDB存储引擎会将这些修改操作记录到重做日志(redo log)和回滚日志(undo log)中。重做日志用于崩溃恢复,确保已提交事务的修改在重启后能重新应用;回滚日志用于事务回滚,撤销未提交事务的修改。
- 预提交:在这个阶段,所有参与事务的存储引擎(如InnoDB)会准备提交事务,向协调者(通常是数据库内核)发送“准备好”的消息。存储引擎会将事务相关的日志写入磁盘,确保日志的持久性。这一步骤确保了即使在后续出现故障,事务的修改也不会丢失,因为重做日志已持久化。
- 第二阶段:提交阶段(Commit)
- 协调者决策:如果协调者收到所有参与者的“准备好”消息,它会决定提交事务。协调者会将事务的提交记录写入二进制日志(binlog),二进制日志记录了数据库的逻辑修改,用于主从复制和数据恢复。这一步是确保持久性和一致性的关键,因为二进制日志记录了最终的事务结果。
- 通知提交:协调者向所有参与者发送“提交”消息。参与者收到“提交”消息后,会将事务标记为已提交,并清理相关的回滚日志(因为不需要回滚了)。如果在这一过程中出现网络故障,参与者在故障恢复后会通过查询协调者(或通过内部机制判断,如基于日志分析)来确定事务的最终状态。
- 异常处理
- 系统崩溃:
- 崩溃恢复:当系统崩溃后重启,InnoDB存储引擎会根据重做日志进行崩溃恢复。它会检查重做日志中的事务记录,将已提交但未完全应用的事务重新应用,确保数据的一致性。对于未完成的事务(即没有在二进制日志中记录提交的事务),会根据回滚日志进行回滚,撤销未提交的修改。
- 网络故障:
- 参与者视角:如果参与者在收到“提交”消息前网络故障,在故障恢复后,它会通过与协调者重新通信(例如使用心跳机制或特定的恢复协议)来确定事务的最终状态。如果协调者确认事务已提交,参与者会完成提交操作;如果事务未提交,参与者会根据回滚日志回滚事务。
- 协调者视角:如果协调者在发送“提交”消息过程中网络故障,它在恢复后会重新向未确认收到“提交”消息的参与者发送“提交”消息,确保所有参与者最终状态一致。同时,协调者基于二进制日志的记录可以准确判断事务的提交状态,即使部分参与者在网络故障期间有不同步的情况,也能在故障恢复后协调一致。
- 系统崩溃: