SQLite中的WAL机制详细介绍


一、什么是WAL?

WAL的全称是Write Ahead Logging,它是很多数据库中用于实现原子事务的一种机制,SQLite在3.7.0版本引入了该特性。

二、WAL如何工作?

在引入WAL机制之前,SQLite使用rollback journal机制实现原子事务。

rollback journal机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。

WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。

同步WAL文件和数据库文件的行为被称为checkpoint(检查点),它由SQLite自动执行,默认是在WAL文件积累到1000页修改的时候;当然,在适当的时候,也可以手动执行checkpoint,SQLite提供了相关的接口。执行checkpoint之后,WAL文件会被清空。

在读的时候,SQLite将在WAL文件中搜索,找到最后一个写入点,记住它,并忽略在此之后的写入点(这保证了读写和读读可以并行执行);随后,它确定所要读的数据所在页是否在WAL文件中,如果在,则读WAL文件中的数据,如果不在,则直接读数据库文件中的数据。

在写的时候,SQLite将之写入到WAL文件中即可,但是必须保证独占写入,因此写写之间不能并行执行。

WAL在实现的过程中,使用了共享内存技术,因此,所有的读写进程必须在同一个机器上,否则,无法保证数据一致性。

三、WAL的优点与缺点

优点:

1.读和写可以完全地并发执行,不会互相阻塞(但是写之间仍然不能并发)。
2.WAL在大多数情况下,拥有更好的性能(因为无需每次写入时都要写两个文件)。
3.磁盘I/O行为更容易被预测。

缺点:

1.访问数据库的所有程序必须在同一主机上,且支持共享内存技术。
2.每个数据库现在对应3个文件:<yourdb>.db,<yourdb>-wal,<yourdb>-shm。
3.当写入数据达到GB级的时候,数据库性能将下降。
4.3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。

四、WAL引入的兼容性问题

在启用了WAL之后,数据库文件格式的版本号由1升级到了2,因此,3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。

禁用WAL会使数据库文件格式的版本号恢复到1,从而可以被SQLite 3.7.0之前的版本识别。

五、WAL引入的性能问题

在一般情况下,WAL会提高SQLite的事务性能;但是在某些极端情况下,却会导致SQLite事务性能的下降。

1.在事务执行时间较长或者要修改的数据量达到GB级的时候,WAL文件会被占用,它会暂时阻止checkpoint的执行(checkpoint会清空WAL文件),这将导致WAL文件变得很大,增加寻址时间,最终导致读写性能的下降。
2.当checkpoint执行的时候,会降低当时的读写性能,因此,WAL可能会导致周期性的性能下降。

六、与WAL相关的PRAGMA和接口

复制代码 代码如下:

PRAGMA journal_mode
PRAGMA wal_checkpoint
PRAGMA wal_autocheckpoint
sqlite3_wal_checkpoint
sqlite3_wal_autocheckpoint
sqlite3_wal_hook



相关阅读:
简单掌握Linux中用于更改访问控制的chacl命令
Android开发笔记之Intent初级学习教程
oracle查看会话锁定的所有对象代码分享
纯CSS实现的紫罗兰风格导航条效果代码
JavaScript定义类和对象的方法
CSS3实现超酷的黑猫警长首页
谁说MacBook不能玩游戏?RMBP13实战热门PC游戏
Ubuntu下安装Nginx和Google Pagespeed的教程
详解PHP中cookie和session的区别及cookie和session用法小结
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
基于Java实现的Base64加密、解密原理代码
IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别实例分析
android动态加载布局文件示例
Mongodb中MapReduce实现数据聚合方法详解
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 春节同学聚会邀请函 工会干部2015严以用权心得体会 忘情醉作文200字 妈妈最开心的一天11200字 描述怀念过去的句子 耳目造句 小学五年级作文500字:校园处处有花香 团队总结范文 05年组织人事工作总结 声声入耳不必事事关心 初中初一作文700字:桃花依旧笑春风 乡镇计生站工作总结 大灰狼和迷路的孩子 春日登楼野望·凭轩聊一望 贺铸《忆仙姿·莲叶初生南浦》宋词鉴赏 玩具小河马作文500字 露齿的微笑 忠诚的约翰涅斯 月亮出来了作文200字 值得尊敬的一个人 3月精品学雷锋活动方案 上帝没有双眼作文200字 为梦想远航演讲稿 春节正月初二祭财神习俗及有关财神的传说 亲亲的在耳边说Love你 或许曾经 或许很远 在一个寒冷的冬天 优化我县经济发展环境调研报告 寂静山林作文600字 用乐观的态度对待人生 爱情从来不是一个人的事 学生会第四季度工作总结 清明,回家 真是一个惊喜700字 美人醉 小学六年级作文550字:嫦娥奔月搞笑版 2 大班社会活动教学反思《合理用钱》 陪你度过岁月如歌 命运掌握在自己手中作文500字 送给彷徨的人 关于寝室友谊的文章3篇 我的中国梦600字3篇 解决欧债危机应处理好六大关系 我左手的是爱情,我右手的却是悲伤、 星空的爱 城堡的熊 悲伤的爱 初中记叙文 燕子的自述 变老师 上中学后遇到的一件事-21200字

Copyright © 2016 phpStudy |