事務四大特性詳解

數據庫事務是指作爲單個邏輯工作單元執行的一系列操作,這些操作要麼全做要麼全不做,是一個不可分割的工作單位。

事務是指對系統進行的一組操作,爲了保證系統的完整性,事務需要具有數據庫事務的四大特性(簡稱ACID)是: 

(1) 原子性(Atomicity)

     一個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實現事務的原子性,要支持回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。
     回滾實際上是一個比較高層抽象的概念,大多數DB在實現事務時,是在事務操作的數據快照上進行的(比如,MVCC),並不修改實際的數據,如果有錯並不會提交,所以很自然的支持回滾。
     而在其他支持簡單事務的系統中,不會在快照上更新,而直接操作實際數據。可以先預演一邊所有要執行的操作,如果失敗則這些操作不會被執行,通過這種方式很簡單的實現了原子性。

(2)一致性(Consistency)  

     一致性是指事務使得系統從一個一致的狀態轉換到另一個一致狀態。事務的一致性決定了一個系統設計和實現的複雜度。事務可以不同程度的一致性:
     強一致性:讀操作可以立即讀到提交的更新操作。
     弱一致性:提交的更新操作,不一定立即會被讀操作讀到,此種情況會存在一個不一致窗口,指的是讀操作可以讀到最新值的一段時間。
     最終一致性:是弱一致性的特例。事務更新一份數據,最終一致性保證在沒有其他事務更新同樣的值的話,最終所有的事務都會讀到之前事務更新的最新值。如果沒有錯誤發生,不一致窗口的大小依賴於:通信延遲,系統負載等。
     其他一致性變體還有:
     單調一致性:如果一個進程已經讀到一個值,那麼後續不會讀到更早的值。
     會話一致性:保證客戶端和服務器交互的會話過程中,讀操作可以讀到更新操作後的最新值。

(3)分離性(亦稱獨立性Isolation)

     併發事務之間互相影響的程度,比如一個事務會不會讀取到另一個未提交的事務修改的數據。在事務併發操作時,可能出現的問題有:
     髒讀:事務A修改了一個數據,但未提交,事務B讀到了事務A未提交的更新結果,如果事務A提交失敗,事務B讀到的就是髒數據。
     不可重複讀:在同一個事務中,對於同一份數據讀取到的結果不一致。比如,事務B在事務A提交前讀到的結果,和提交後讀到的結果可能不同。不可重複讀出現的原因就是事務併發修改記錄,要避免這種情況,最簡單的方法就是對要修改的記錄加鎖,這回導致鎖競爭加劇,影響性能。另一種方法是通過MVCC可以在無鎖的情況下,避免不可重複讀。
     幻讀:在同一個事務中,同一個查詢多次返回的結果不一致。事務A新增了一條記錄,事務B在事務A提交前後各執行了一次查詢操作,發現後一次比前一次多了一條記錄。幻讀是由於併發事務增加記錄導致的,這個不能像不可重複讀通過記錄加鎖解決,因爲對於新增的記錄根本無法加鎖。需要將事務串行化,才能避免幻讀。
     事務的隔離級別從低到高有:
     Read Uncommitted:最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。所有的併發事務問題都會發生。
     Read Committed:只有在事務提交後,其更新結果纔會被其他事務看見。可以解決髒讀問題
     Repeated Read:在一個事務中,對於同一份數據的讀取結果總是相同的,無論是否有其他事務對這份數據進行操作,以及這個事務是否提交。可以解決髒讀、不可重複讀
     Serialization:事務串行化執行,隔離級別最高,犧牲了系統的併發性。可以解決併發事務的所有問題
     通常,在工程實踐中,爲了性能的考慮會對隔離性進行折中。

(4)持久性(Durability)

持久性意味着當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數據庫中數據的改變應該是永久性的,即對已提交事務的更新能恢復。持久性通過數據庫備份和恢復來保證。

事務提交後,對系統的影響是永久的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章