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 交通频道 作文范文 陆川-茂名 淮南东-绍兴北 沙坨子-赤峰 铁岭-达拉滨 邹城-兴城 中山-深圳北 广水-新化 宁陵县-梁山 宜春-天津 水富-镇远 达州-清河城 聊城-武夷山 潮阳-临海 赤峰-庙宫 上普雄-枣子林 昌图-大板 镇江-于都 昆明-羊者窝 江油-徽县 图们-梅河口 松江河-桥头 义乌-兴义 佳木斯-双鸭山 荣成-桃村北 全州南-邢台东 通辽-沟帮子 武威南-潼关 巴东-石门县北 上店-道德 丽水-福州南 商都-查布嘎 商都-乌鲁木齐南 兖州-无锡 鸡东-治山 曲阜东-祁阳 天门-广安 衡山-耒阳 邹城-聊城 汉口-北戴河 宜州-广州 南平南-天津 菏泽-石家庄北 衡阳东-鹤壁东 陆川-遂溪 三门峡南-唐山 永州-长沙 伊宁-上海 北京西-西安 台州-宁海 义乌-建瓯西 贺州-玉林 内江-茂名西 驻马店西-祁阳 明光-静海 墨玉-阿克陶 厦门-天水 古鲁满汗-金家店 上海-蚌埠 景泰-天津 四平东-北京南 三道湖-梅河口 重庆北-紫阳 费县-衡水 南阳-沈阳 吉首-安阳 介休-南召 天津-诸暨 六枝-广州 诸暨-宣威 潢川-合肥 麻城北-涪陵北 铁岭-深州 巢湖-原平 衡水-瑞金 影壁山-露水河 香坊-南岔 山城镇-凤凰城 大庆西-海拉尔 德惠-定陶 武汉-溧水 梅州兴宁客车装饰地址
从西安到荆州的车能提前订票吗
株洲到郴州客车汽车有几点钟的
列车票 学生票_列车票 学生票
7月中旬去西藏 必备物品
从鞍山到讷河有多远该怎么坐车
我想到鄂尔多斯拉煤,不知道怎么联系 ,那边前景好么,本人手
可否能拿到经济补偿金
北京沈阳之间六提之后动车组时刻
从中山古镇海洲市场到石岐区悦来南华光路57号中山市会计学会
从无锡列车火车站到无锡市第一女子中学公交路线怎么走大约要多
洛阳从东花坛怎么走去新区体育场
请问K518的卧铺车厢是几号到几号
从汤口到黄山列车火车站最晚几点还有车
绿宝石493里我去那个南方小岛,为什么只有一个蛋,水都怎么出...
嘉兴有哪些风土人情和民俗文化
北京到天津火车票多少钱
请问春节后从河北唐山去哈尔滨旅游食宿、观光要多少银子呢
从惠州到广州列车火车站怎么样最方便
安吉到舟山怎么坐车最佳
现在武汉到合肥的汽车客车票价是 多少
我明天武汉到南宁的航班,据说南宁下小雨,航班会影
火车列车时间_火车列车时间
齐齐哈尔到福建莆田要多久 票价钱数如何 怎样购票 拍拖大家嘞
汕头哪里能练习摩托车,请哪位哥哥姐姐说下具体地方 谢谢
请问从北京到包头或者是北京到内蒙东胜的路线及时间
有经过天柱山的列车火车吗什么时间能买到元月22日的车车票
聊城至曲阜坐客车汽车需要多长时间客车汽车价多少钱
青海西藏有哪些著名的地方和小吃?
泰州到东台怎么坐车

Copyright © 2016 phpStudy |