ACID
資料庫事務正確執行的四個基本要素的縮寫
ACID,指資料庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的資料庫,必須要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性,交易過程極可能達不到交易方的要求。
整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一個事務可以封裝狀態改變(除非它是一個只讀的)。事務必須始終保持系統處於一致的狀態,不管在任何給定的時間併發事務有多少。
也就是說:如果事務是併發多個,系統也必須如同串列事務一樣操作。其主要特徵是保護性和不變性(Preserving an Invariant),以轉賬案例為例,假設有五個賬戶,每個賬戶餘額是100元,那麼五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論併發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性。
隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串列化,為了防止事務操作間的混淆,必須串列化或序列化請求,使得在同一時間僅有一個請求用於同一數據。
在事務完成以後,該事務對資料庫所作的更改便持久的保存在資料庫之中,並不會被回滾。
由於一項操作通常會包含許多子操作,而這些子操作可能會因為硬體的損壞或其他因素產生問題,要正確實現ACID並不容易。ACID建議資料庫將所有需要更新以及修改的資料一次操作完畢,但實際上並不可行。
目前主要有兩種方式實現ACID:第一種是Write ahead logging,也就是日誌式的方式(現代資料庫均基於這種方式)。第二種是Shadow paging。
相對於WAL(write ahead logging)技術,shadow paging技術實現起來比較簡單,消除了寫日誌記錄的開銷恢復的速度也快(不需要redo和undo)。shadow paging的缺點就是事務提交時要輸出多個塊,這使得提交的開銷很大,而且以塊為單位,很難應用到允許多個事務併發執行的情況——這是它致命的缺點。
WAL 的中心思想是對數據文件 的修改(它們是表和索引的載體)必須是只能發生在這些修改已經 記錄了日誌之後 -- 也就是說,在日誌記錄沖刷到永久存儲器之後. 如果我們遵循這個過程,那麼我們就不需要在每次事務提交的時候 都把數據頁沖刷到磁碟,因為我們知道在出現崩潰的情況下,我們可以用日誌來恢復資料庫:任何尚未附加到數據頁的記錄 都將先從日誌記錄中重做(這叫向前滾動恢復,也叫做 REDO)然後那些未提交的事務做的修改將被從數據頁中刪除(這叫向後滾動恢復 - UNDO)。
ACID,是指資料庫管理系統(DBMS)在寫入或更新資料的過程中,為保證事務(transaction)是正確可靠的,所必須具備的四個特性:原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、持久性(durability)。
在資料庫系統中,一個事務是指:由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額,以及向目標賬戶添加金額,這兩個資料庫操作的總和,構成一個完整的邏輯過程,不可拆分。這個過程被稱為一個事務,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所說明。
● 關係型資料庫
● InnoDB
● PostgreSQL