MST
星途 面试题库

面试题:SQLite WAL模式数据一致性在崩溃恢复场景下的实现细节

在SQLite WAL模式下,假设系统发生崩溃,从崩溃恢复过程中,数据库是怎样依据WAL日志来保证数据一致性的?请详细说明相关的机制和步骤。
25.3万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试
  1. WAL模式简介
    • 在SQLite的WAL(Write - Ahead Logging)模式下,写操作不会直接修改数据库文件,而是将修改记录写入到一个WAL日志文件中。
  2. 崩溃恢复机制
    • 检查点机制
      • SQLite会定期或在特定条件下执行检查点操作。检查点操作会将WAL日志中已提交的修改合并到数据库文件中,并截断WAL日志。
      • 在系统崩溃前,最近一次检查点操作之后的WAL日志记录了尚未合并到数据库文件的修改。
    • 崩溃恢复步骤
      • 重新打开数据库:当系统从崩溃中恢复并重新打开数据库时,SQLite会首先定位到WAL日志文件。
      • 分析WAL日志
        • SQLite会扫描WAL日志,识别出所有已提交的事务记录。每个事务在WAL日志中有其特定的标记和记录格式。
        • 对于已提交的事务,SQLite会按照日志记录中的操作顺序,重新应用这些修改到数据库文件中。例如,如果日志记录了对某张表中某条记录的更新操作,SQLite会执行该更新,将数据库文件恢复到崩溃前已提交事务结束时的状态。
      • 清理WAL日志
        • 在成功将所有已提交事务的修改应用到数据库文件后,SQLite会截断WAL日志,丢弃那些已经重新应用的日志记录,使得WAL日志回到一个初始的干净状态,为后续的写操作做好准备。
      • 处理未提交事务
        • WAL日志中未提交的事务记录会被忽略。因为这些事务在崩溃前没有完成提交,其修改不应该被持久化到数据库中,从而保证了数据的一致性,只保留崩溃前已提交的正确数据状态。