什么是數據庫ACID?


什么是數據庫ACID?

一個事務本質上有四個特點ACID:

  1. 原子性

  2. 一致性

  3. 隔離性

  4. 耐久性

1)原子性(Atomic):

事務中各項操作,要么全做要么全不做,任何一項操作的失敗都會導致整個事務的失敗,就像原子一樣不可分割;

 

2)一致性(Consistent):

事務結束后系統狀態是一致的;一個事務可以封裝狀態改變(除非它是一個只讀的)。

事務必須始終保持系統處於一致的狀態,不管在任何給定的時間並發事務有多少。

舉個例子:如果事務是並發多個,系統也必須如同串行事務一樣操作。其主要特征是保護性和不變性(Preserving an Invariant),以轉賬案例為例,假設有五個賬戶,每個賬戶余額是100元,那么五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論並發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性。

 

3)隔離性(Isolated):

並發執行的事務彼此無法看到對方的中間狀態;

隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一數據。

 

4)持久性(Durable):

事務完成后所做的改動都會被持久化,即使發生災難性的失敗。通過日志和同步備份可以在故障發生后重建數據。

在事務完成以后,該事務對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。
由於一項操作通常會包含許多子操作,而這些子操作可能會因為硬件的損壞或其他因素產生問題,要正確實現ACID並不容易。ACID建議數據庫將所有需要更新以及修改的資料一次操作完畢,但實際上並不可行。
目前主要有兩種方式實現ACID:第一種是Write ahead logging,也就是日志式的方式(現代數據庫均基於這種方式)。第二種是Shadow paging。
相對於WAL(write ahead logging)技術,shadow paging技術實現起來比較簡單,消除了寫日志記錄的開銷恢復的速度也快(不需要redo和undo)。
shadow paging的缺點就是事務提交時要輸出多個塊,這使得提交的開銷很大,而且以塊為單位,很難應用到允許多個事務並發執行的情況——這是它致命的缺點。
WAL 的中心思想是對數據文件 的修改(它們是表和索引的載體)必須是只能發生在這些修改已經 記錄了日志之后 -- 也就是說,在日志記錄沖刷到永久存儲器之后.
如果我們遵循這個過程,那么我們就不需要在每次事務提交的時候 都把數據頁沖刷到磁盤,因為我們知道在出現崩潰的情況下, 我們可以用日志來恢復數據庫:
任何尚未附加到數據頁的記錄 都將先從日志記錄中重做(這叫向前滾動恢復,也叫做 REDO) 然后那些未提交的事務做的修改將被從數據頁中刪除 (這叫向后滾動恢復 - UNDO)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM