6.0 原子操作实现细节
3.0节概述了SQLite中原子提交的工作原理,但略去了一些关键细节。以下内容补充说明这些方面。

6.1 扇区写入的完整性
在向日志文件写入数据库文件的初始数据时(见3.5节),SQLite总是写入完整扇区,即使文件页小于扇区大小。早期版本的SQLite固定扇区大小为512字节,由于最小页大小也是512字节,这并不是问题。自3.3.14版本后,SQLite支持更大扇区的存储设备。因此,从该版本起,若扇区内任何一页被写入回滚日志文件,整个扇区的内容都将写入日志文件。这确保在扇区写入时若出现掉电问题,数据库不会损坏。例如,当页2被修改时,实际硬件需重写扇区1中的页1、3和4,因为硬件操作按扇区为单位。若在写入时断电,页1、3、4的数据可能不完整,因此需要确保整个扇区内容均写入日志文件,以防数据损坏。

6.2 写日志文件时垃圾数据的处理
在向日志文件追加数据时,SQLite会假定文件大小会先增大,新增部分可能填充垃圾数据,然后再用正确数据替换这些垃圾。换句话说,SQLite假设文件先调整大小,然后内容才写入。如果在文件增大后内容未写完时断电,则日志文件会残留垃圾数据。下次供电恢复时,另一个SQLite进程可能会读取含有垃圾数据的日志文件,并将这些垃圾数据回滚到数据库中。通过这种方式来管理日志文件中的垃圾,SQLite保证了数据完整性。