文件名称:写日志文件时垃圾的处理-tdc-gp30 external circuit for gas meters application note
文件大小:1.95MB
文件格式:PDF
更新时间:2024-06-29 08:14:39
SQlite 学习教程
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 进程就会看到这些保存了垃圾数据的日志文件,并同时会把这些垃圾数据回滚到数据库文 88 / 123