-
原子提交行为测试-线性代数及其应用中文版下载
资源介绍
7.4 单页更新及扇区原子写
从 3.5.0 开始,新的 VFS 接口包含了一个新的方法: xDeviceCharacteristics ,它能够读取实际的文件系统可能有的
特性。xDeviceCharacteristics 会报告是否文件系统能够支持扇区写原子操作。
回想前面,在一般情况下 SQLite 假定扇区写是线性的,但是非原子的。线性写从另一个扇区结束点开始一字节一
字节进行修改,直到扇区的结束点。如果在写一个扇区时,线性写会将修改一个扇区的一部分,而另一部分是没有
变动的。在一个扇区原子写的情况下,要么整个扇区被重写了,要么扇区没有发生变化。
我们相信大部分现代磁盘驱动器实现了原子写操作。当停电发生时,磁盘驱动器可以利用电容中的电能,同时(或
者)利用盘片旋转的角动量来完成正在进行中的任何操作。然而,在系统写调用与磁盘电子器材之间,存在有太多
的层次。因此在 unix 及 win32 上面的 VFS 实现比较安全的选择是,我们假定扇区写操作是非原子性的。On the other
hand, device manufactures with more control over their filesystems might want to consider enabling the atomic write
property of xDeviceCharacteristics if their hardware really does do atomic writes.
当一个扇区写是原子性的,并且扇区大小与页大小是相同,并且一次数据库的变化只是某一个单独的页发生变化时,
SQLite 会跳过整个日志记录过程,直接简单地将被修改过的数据写回到数据库文件。数据库首页中的变更计数器将
会被独立进行修改—因为不会对数据库产生任何影响—即使在计数器更新以前发生停电。.
7.5 Filesystems With Safe Append Semantics
SQLite3.5.0 中介绍的另一个优化是利用实际磁盘的“安全追加”行为。回想上面,SQLite 假定为一个文件追加数据
时(特别是针对回滚日志文件),会先增大文件的大小,之后才会把数据内容写入。所以在文件的大小已经变化,
而内容还没有写完的情况下发生掉电,那么文件新增部分将会有一些无效的垃圾数据。VFS 的 xDeviceCharacteristics
可以用来指示文件系统是否实现了“安全追加”语义。这意味着在文件大小变大之前会先写入文件内容。这就防止
当系统崩溃或掉电后,垃圾数据出现在回滚日志文件中
当文件系统有安全追加特性时,SQLite 总是保存一个特别的值:-1 来标明日志文件中页总数。页面数量为-1 告诉任
何尝试进行回滚操作程序页面数量需要从日志文件大小计算得来。同时,这-1 值会从不进行修改。所以,在一个提
交过程中,我们节省一个 flsuh 操作及日志文件首页的扇区写入操作。此外,当发生缓存溢出时,也不必要在日志
文件后面增加一个新的日志头。我们能够简单的在一个现有的日志文件中添加一些新的页。
8.0 原子提交行为测试
SQLite 的开发者对 SQLite 在面对电源故障及系统崩溃时所拥有健壮性具有足够的自信。因为自动化的测试过程做
- 上一篇: 连接查询-线性代数及其应用中文版
- 下一篇: SQLPro for SQLite[mac 破解版]