事務處理
首先咱們須要瞭解什麼是
事務處理(TRANSACTION):它是由一個或多個SQL語句序列結合在一塊兒所造成的一個邏輯處理單元。
事務處理中的每一個語句都是完成整個任務的一部分工做,全部的語句組織在一塊兒可以完成某一特定的任務。DBMS在對
事務處理中的語句進行處理時,是按照下面的約定來進行的,這就是「事務處理中的全部語句被做爲一個原子工做單位,全部的語句既可成功地被執行,也能夠沒有任何一個語句被執行」。DBMS負責完成這種約定,即便在
事務處理中應用程序異常退出,或者是硬件出現故障等各類意外狀況下,也是如此。在任何意外狀況下,DBMS都負責確保在系統恢復正常後,數據庫內容決不會出現「部分
事務處理中的語句被執行完」的狀況。
數據庫事務具備四個特性,即ACID:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。 數據庫
因爲一項操做一般會包含許多子操做,而這些子操做可能會由於硬件的損壞或其餘因素產生問題,要正確實現ACID並不容易。ACID建議數據庫將全部須要更新以及修改的資料一次操做完畢,但實際上並不可行。
目前主要有兩種方式實現ACID:第一種是Write ahead logging,也就是日誌的方式。第二種是Shadow paging。
SQLite使用技術就是影子分頁技術(shadow paging)。shadow paging技術可能比較落後的技術,因此現代的DBMS不多采用。
相對於WAL(write ahead logging)技術,shadow paging技術實現起來比較簡單,消除了寫日誌記錄的開銷恢復的速度也快(不須要redo和undo)。shadow paging的缺點就是事務提交時要輸出多個塊,這使得提交的開銷很大,並且以塊爲單位,很難應用到容許多個事務併發執行的狀況——這是它致命的缺點。
WAL 的中心思想是對數據文件 的修改(它們是表和索引的載體)必須是隻能發生在這些修改已經 記錄了日誌以後 -- 也就是說,在日誌記錄沖刷到永久存儲器以後. 若是咱們遵循這個過程,那麼咱們就不須要在每次事務提交的時候 都把數據頁沖刷到磁盤,由於咱們知道在出現崩潰的狀況下, 咱們能夠用日誌來恢復數據庫:任何還沒有附加到數據頁的記錄 都將先從日誌記錄中重作(這叫向前滾動恢復,也叫作 REDO) 而後那些未提交的事務作的修改將被從數據頁中刪除 (這叫向後滾動恢復 - UNDO).如今SQLite也提供了WAL日誌機制。