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 交通频道 作文范文 读《胡小闹日记之妈妈我爱你》有感 处分思想汇报 从泥鳅到跳龙门 喜羊羊与灰太狼——优点强化机550字 六月,将远 2011年中学综合整治工作总结 那年夏天 你的落泪 致我逝去的那些日子作文1500字 放假记事 2015市中心医院医生转正申请书 2013年11月试用期员工工作总结 高三如何调整好情绪主题班会 我来了、大家可要欢迎我哦 结婚祝福话语 生命是两场盛宴的距离 小学六年级作文350字:刮鱼鳞 蚂蚁报恩读后感300字 学生必读的经典励志小说:《橘子不是唯一的水果》 习惯——决定成败的细节作文600字 儿子遇劫 暧昧生日祝福短信 属于我季节作文700字 冬日雪景作文600字 罂粟花的凋零,唯美的凄凉! 很多人喜欢在钱夹里放照片 一小时交通岗的感受 酒暖,回忆,思念瘦(刹那发表了日志) 《假如给我三天光明》读后感_550字 初中初二作文800字:谢谢您妈妈 民政部工作人员科学发展观学习心得 触手不及 爱与被爱真的如此简单 经年已过,我还有什么。。。 笑话200字 不争是最大的争的哲理 匆匆那年乔燃经典语录 永不结束的故事 观《我的母亲赵一曼》有感作文1300字 不讲卫生的小花狗作文200字 空姐英文自我介绍 寻找拍摄的主旋律(摄影有感) 岁月中的绽放,关于时间的作文400字 毕业酒会讲话 小学四年级作文400字:和睦的一家人 关于日本企业会计财务管理情况的考察报告_考察报告 缅怀我的父亲 羊皮卷之十:以一个推销员的身份来祈祷 好久没有呢 种植日记作文300字 关于友情的作文

Copyright © 2016 phpStudy |