菜鸟学数据库——WAL模式及其原理

参考文章:数据库

什么是WAL?

WAL模式的全称是Write Ahead Logging,它是不少数据库中用于实现原子事务的一种机制,SQLite 3.7.0版本引入了该特性。Android 3.0 以上版本的SQLite 版本都大于3.7.0。markdown

在WAL模式下,SQLite中除了db文件,还包含两个文件,.wal文件和.shm文件,前者是日志文件,后者是日志索引文件。并发

WAL如何工做?

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

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

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

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

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

在写的时候,SQLite将之写入到WAL文件中便可,可是必须保证独占写入,所以写写之间不能并行执行code

开启WAL模式能够提升写入数据库的速度,读和写之间不会阻塞,可是写与写之间依然是阻塞的。在项目中开启WAL模式,能够提升并发。因为使用WAL比rollback journal的模式减小了写的i/o,因此写入时速度较快,可是因为在读取数据时也须要读取WAL日志验证数据的正确性,因此读取数据相对要慢。orm

相关文章
相关标签/搜索