ACID,是指在數據庫管理系統(DBMS)中事務所具有的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
在數據庫系統中,一個事務是指由一系列數據庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬户扣除金額,以及向目標賬户添加金額,這兩個數據庫操作的總和構成一個完整的邏輯過程,不可拆分。這個過程被稱為一個事務,具有ACID特性。
原子性 整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 一致性 在事務開始之前和事務結束以後,數據庫的完整性約束沒有被破壞。 隔離性 兩個事務的執行是互不干擾的,一個事務不可能看到其他事務運行時,中間某一時刻的數據。 持久性 在事務完成以後,該事務所對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。
由於一項操作通常會包含許多子操作,而這些子操作可能會因為硬件的損壞或其他因素產生問題,要正確實現ACID並不容易。ACID建議數據庫將所有需要更新以及修改的資料一次操作完畢,但實際上並不可行。
目前主要有兩種方式實現ACID:第一種是Write ahead logging,也就是日誌式的方式。第二種是Shadow paging。
相對於WAL(write ahead logging)技術,shadow paging技術實現起來比較簡單,消除了寫日誌記錄的開銷恢復的速度也快(不需要redo和undo)。shadow paging的缺點就是事務提交時要輸出多個塊,這使得提交的開銷很大,而且以塊為單位,很難應用到允許多個事務併發執行的情況——這是它致命的缺點。
WAL 的中心思想是對數據文件 的修改(它們是表和索引的載體)必須是隻能發生在這些修改已經 記錄了日誌之後 -- 也就是説,在日誌記錄沖刷到永久存儲器之後. 如果我們遵循這個過程,那麼我們就不需要在每次事務提交的時候 都把數據頁沖刷到磁盤,因為我們知道在出現崩潰的情況下, 我們可以用日誌來恢復數據庫:任何尚未附加到數據頁的記錄 都將先從日誌記錄中重做(這叫向前滾動恢復,也叫做 REDO) 然後那些未提交的事務做的修改將被從數據頁中刪除 (這叫向後滾動恢復 - UNDO)。