1. 程式人生 > >【資料庫】——隔離級別和傳播行為

【資料庫】——隔離級別和傳播行為

一直以來對資料庫的隔離級別和傳播行為都有些迷糊,特此總結一下。

一、隔離級別:

資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。

1. ISOLATION_READ_UNCOMMITTED(未提交讀):

這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的資料。 這種隔離級別會產生髒讀,不可重複讀和幻讀。

(1)所有事務都可以看到其他未提交事務的執行結果
(2)本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少
(3)該級別引發的問題是——髒讀(Dirty Read):讀取到了未提交的資料

2. ISOLATION_READ_COMMITTED:保證一個事務修改的資料提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的資料

(1)這是大多數資料庫系統的預設隔離級別(不是MySQL預設的)
(2)它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變
(3)這種隔離級別出現的問題是——不可重複讀(Nonrepeatable Read):不可重複讀意味著我們在同一個事務中執行完全相同的select語句時可能看到不一樣的結果。

3. ISOLATION_REPEATABLE_READ:這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的資料外,還保證了避免下面的情況產生(不可重複讀)。

(1)這是MySQL的預設事務隔離級別
(2)它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行
(3)此級別可能出現的問題——幻讀(Phantom Read):當用戶讀取某一範圍的資料行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的資料行時,會發現有新的“幻影” 行
(4)InnoDB和Falcon儲存引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題

4. ISOLATION_SERIALIZABLE:這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。 除了防止髒讀,不可重複讀外,還避免了幻像讀。 


(1)這是最高的隔離級別
(2)它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。
(3)在這個級別,可能導致大量的超時現象和鎖競爭

二、傳播行為

1、PROPAGATION_REQUIRED:如果當前沒有事務,就建立一個新事務,如果當前存在事務,就加入該事務,該設定是最常用的設定。

2、PROPAGATION_SUPPORTS:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。‘

3、PROPAGATION_MANDATORY:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就丟擲異常。

4、PROPAGATION_REQUIRES_NEW:建立新事務,無論當前存不存在事務,都建立新事務。

5、PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

6、PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。

7、PROPAGATION_NESTED:如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

對於資料庫的隔離級別和傳播行為是不同的,還需要我們在工作中繼續體會。