數據庫事務的ACID特性和隔離級別

1. 事務的四個特性

數據庫事務(Transaction)是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。一方面,當多個應用程序併發訪問數據庫時,事務能夠在應用程序間提供一個隔離方法,防止互相干擾。另外一方面,事務爲數據庫操做序列提供了一個從失敗恢復正常的方法。 數據庫

事務具備四個特性:原子性(Atomicity)、一致性(Consistency)、隔離型(Isolation)、持久性(Durability),簡稱ACID。 併發

1.1 原子性(Atomicity)

事務的原子性是指事務中的操做不可拆分,只容許所有執行或者所有不執行。 性能

1.2 一致性(Consistency)

事務的一致性是指事務的執行不能破壞數據庫的一致性,一致性也稱爲完整性。一個事務在執行後,數據庫必須從一個一致性狀態轉變爲另外一個一致性狀態。 spa

1.3 隔離型(Isolation)

事務的隔離型是指併發的事務相互隔離,不能互相干擾。 事務

1.4 持久性(Durability)

事務的持久性是指事務一旦提交,對數據的狀態變動應該被永久保存。 ci

2 事務的四個隔離級別

實際工做中事務幾乎都是併發的,徹底作到互相之間不干擾會嚴重犧牲性能,爲了平衡隔離型和性能,SQL92規範定義了四個事務隔離級別:讀未提交(Read Uncommitted)、讀已提交(Read Committed)、可重複讀(Repeatable Read)、串行化(Serializable)。四個級別逐漸加強,每一個級別解決上個級別的一個問題。 it

2.1 讀未提交(Read Uncommitted)

另外一個事務修改了數據,但還沒有提交,而本事務中的SELECT會讀到這些未被提交的數據(髒讀)。 io

髒讀是指另外一個事務修改了數據,但還沒有提交,而本事務中的SELECT會讀到這些未被提交的數據。
table

2.2 讀已提交(Read Committed)

本事務讀取到的是最新的數據(其餘事務提交後的)。問題是,在同一個事務裏,先後兩次相同的SELECT會讀到不一樣的結果(不可重複讀)。 程序

不可重複讀是指同一個事務執行過程當中,另一個事務提交了新數據,所以本事務前後兩次讀到的數據結果會不一致。

2.3 可重複讀(Repeatable Read)

在同一個事務裏,SELECT的結果是事務開始時間點的狀態,一樣的SELECT操做讀到的結果會是一致的。可是,會有幻讀現象。

不可重複讀保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性)。可是,若是另外一個事務同時提交了新數據,本事務再更新時,就會發現了這些新數據,貌似以前讀到的數據是幻覺,這就是幻讀

2.4 串行化(Serializable)

全部事務只能一個接一個串行執行,不能併發。

3 隔離級別的選擇

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

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

相關文章
相關標籤/搜索