菜鳥學數據庫——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

相關文章
相關標籤/搜索