-
写日志文件时垃圾的处理-线性代数及其应用中文版下载
资源介绍
6.0 原子操作的一些实现细节
3.0 节大致描述了 SQLite 中原子提交是如何工作的。但它略过了许多重要的细节。下面的这些部分将尝试补充说明
这些地方。
6.1 总是记录整个扇区
当数据库文件的原始代码被写入到日志文件时(参见 3.5 节),SQLite 总是写入完整的扇区,即使数据文件页大小
是小于一个扇区。由于历史上的原因,SQLite 的扇区大小原先是固定为 512 字节,此外由于最小的页大小是 512 字
节,因此这从来都不是一个问题。自 SQLite3.3.14 版本以来,SQLite 便有可能使用最小扇区大于 512 字节的海量存
储设备。所以,自从 3.3.14 版本开始,只要一个扇区中的任何一页被写进到回滚日志文件中,那么同一扇区中的所
有节都会写入到日志文件中去。
将扇区中的所有页都写入日志文件中去是很重要的,它将可以防止因为在写一个扇区时发生掉电故障而导致数据库
损坏。假充页 1,2,3,4 都是保存扇区 1 中,页 2 被修改了。为了将这种变更写回到页 2 中,实际的硬件设备将
也会同时重写页 1,3 及 4 的内容—这是因为硬件必须以扇区为单元作写操作。如果一个写操作正在进行的时候,
由于电源的原因,发生了中断,这样,页 1,3,4 中会有 1 页或者多页数据是不完整,不正确的。因此为了防止这
种损坏,数据库文件的同一扇区中的所有页都必须写入到日志文件中去。
6.2 写日志文件时垃圾的处理
当向一个日志文件追加数据时,QLite 总是悲观的假定文件会首先变大,变大的部分会填之一些无效的垃圾数据,在
此之后正确的数据才会取代这些垃圾。换而言之,SQLite 假定文件先改变大小,然后内容才会写进来。如果在文件
大小增大之后,在内容还没有写完之前发生掉电故障,那么这些日志文件就会留下一些垃圾数据在其中。下次当电
源恢复,另一个 SQLite 进程就会看到这些保存了垃圾数据的日志文件,并同时会把这些垃圾数据回滚到数据库文
- 上一篇: 多文件提交-线性代数及其应用中文版
- 下一篇: 版以及早期-线性代数及其应用中文版