-
不必将空闲页写进日志-线性代数及其应用中文版下载
资源介绍
7.1 在事务间保存缓存
事务提交处理过程中,节 3.12 指 出一旦共享锁被释放,用户空间所有的缓存的数据库内容镜像都必须得抛弃。这
是因为如果没有一个共享锁,其他进程就可以修改数据库的内容,所以用户空间所缓 存的数据库数据就会过期无
效。因此,每一个新的事务会尝试去读取它以前读取过的数据。这似乎并不是太糟糕,因为第一次读取过的数据还
可能存在于操作系统的 磁盘缓存中。所以这个读实际上只是只一次从内核空间到用户空间的复制。但尽管是这样,
这还是需要占用 cpu 时间的。
自从 SQLite3.3.14 开始,新增了一个机制用来减少一些不必要的数据重复读取操作。最新的 SQLite 中,用户空间的
页面缓存在用户锁释放之后仍然保留。之后,当要开始一个新事务,在取得一个共享锁之后,SQLite 会尝试检查在
此期间是否有进程对数据进行了修改。如果在锁释放这段时间,数据库发生任何的变化,那么用户空间的缓存就会
被释放。但通常情况下,数据文件是没有被修改过的,因此用户空间的缓存因而得到保留,一些不必要的读取操作
从而得到了减免。
为了判断数据库文件是否被修改过,SQLite 使用了一个计数器,存于数据库文件头部(处于字节 24~27),每针对
数据库做一次修改,就会对此值进行一回增长。SQLite 会在释放一个锁之前记录一份这个值的。当下回取得锁之后,
就会去与原先保存的值进行比较。如果值不一致,则必须清除这些缓存,反之缓存可以重新使用。
7.2 独享访问模式
SQLite 从 3.3.14 版本之后增加一个“独享访问模式”概念。当处于独享访问模式时,SQLite 会在一个事务完成之后
仍然保留独享锁。这将阻止其他进程访问这个数据库;由于大部分的开发都只有一个进程访问数据库,所以大部分
情况下这不是一个严重的问题。独享访问模式的好处可以在三个方面减少磁盘 IO 数量:
1) 不再需要为每个事务完成之后修改文件头部的变更计数器。这可以为回滚日志及数据库文件减少一次页写入。
2) 没有其他进程会修改数据库,所以不必在一个事务开始的时候去检查变更计数器或者清除掉用户空间的缓存。
3) 当一个事务完成之后,可以采用清空日志文件的方式,而不必去删除这个文件。在大多数的操作系统中,清空
文件要远快于删除一个文件。
上述的第三点优化,清空而不是删除回滚日志文件,不再要求一直取得一个独享锁。在理论上,我们可以在任何时
刻做这项优化,并不是只有在独享访问模式时。在将来的 SQLite 版本中我们或许可能这么做。但当前的版本(3.5.0)
回滚日志文件清空优化只发生在独享访问模式。
7.3 不必将空闲页写进日志
SQLite 数据库的信息被删除之后,这些被删除的数据所使用的页会被加入到空页链表之中。后来的插入操作会尽量
先使用空页链表中的页。
- 上一篇: 版以及早期-线性代数及其应用中文版
- 下一篇: 获得一个独享锁-线性代数及其应用中文版