ACID理論介紹

ACID理論

ACID理論介紹

數據庫事務(Transaction)是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。

一方面,當多個應用程序併發訪問數據庫時,事務可以在應用程序間提供一個隔離方法,防止互相干擾。另一方面,事務為數據庫操作序列提供了一個從失敗恢復正常的方法。

事物有下面4個特性:

  • 原子性(Atomicity),事務的原子性是指事務中的操作不可拆分,只允許全部執行或者全部不執行;
  • 一致性(Consistency),事務的一致性是指事務的執行不能破壞數據庫的一致性,一致性也稱為完整性。一個事務在執行後,數據庫必須從一個一致性狀態轉變為另一個一致性狀態;
  • 隔離型(Isolation),事務的隔離型是指併發的事務相互隔離,不能互相干擾;
  • 持久性(Durability),事務的持久性是指事務一旦提交,對數據的狀態變更應該被永久保存;

實際工作中事務幾乎都是併發的,完全做到互相之間不干擾會嚴重犧牲性能,為了平衡隔離型和性能,SQL92規範定義了四個事務隔離級別:

  1. 讀未提交(Read Uncommitted),另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據(髒讀)。髒讀是指另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據。
  2. 讀已提交(Read Committed),本事務讀取到的是最新的數據(其他事務提交後的)。問題是,在同一個事務裡,前後兩次相同的SELECT會讀到不同的結果(不可重複讀)。不可重複讀是指同一個事務執行過程中,另外一個事務提交了新數據,因此本事務先後兩次讀到的數據結果會不一致。
  3. 可重複讀(Repeatable Read),在同一個事務裡,SELECT的結果是事務開始時間點的狀態,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象。不可重複讀保證了同一個事務裡,查詢的結果都是事務開始時的狀態(一致性)。但是,如果另一個事務同時提交了新數據,本事務再更新時,就會發現了這些新數據,貌似之前讀到的數據是幻覺,這就是幻讀。
  4. 串行化(Serializable),所有事務只能一個接一個串行執行,不能併發。

事務隔離級別越高,越能保證數據的一致性,但對併發性能影響越大,一致性和高性能必須有所取捨或折中。

一般情況下,多數應用程序可以選擇將數據庫的隔離級別設置為讀已提交,這樣可以避免髒讀,也可以得到不錯的併發性能。儘管這個隔離級別會導致不可重複度、幻讀,但這種個別場合應用程序可以通過主動加鎖進行併發控制。

更多內容請關注每日編程,每天進步一點。


分享到:


相關文章: