前一個文章講述了事務(wù)ACID的特性以及并發(fā)事務(wù)造成的數(shù)據(jù)不一致性問題,事務(wù)ACID以及不一致性問題,接下來講解下MySQL中隔離級別。
MySQL隔離級別
因為上述的幾個數(shù)據(jù)不一致性問題,MySQL主要提供了四個隔離級別來解決這些問題,用一個表格來描述各個隔離級別解決的以及還存在的不一致問題。
(??表示還是有這種現(xiàn)象,??表示不會出現(xiàn)這個問題)
| 隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
|---|---|---|---|
| 讀未提交 | ?? | ?? | ?? |
| 讀已提交 | ?? | ?? | ?? |
| 可重復(fù)讀 | ?? | ?? | ?? |
| 串行化 | ?? | ?? | ?? |
串行化的隔離級別最高,讀未提交的隔離級別最低。隔離級別越高,說明事務(wù)的并發(fā)度越低,當(dāng)然執(zhí)行效率也越低。接下來具體講解下這幾個隔離級別,應(yīng)用中根據(jù)實際情況來選擇隔離級別,MySQL默認隔離級別為可重復(fù)讀,可以通過以下命令查看系統(tǒng)級、會話級的默認隔離級別。

講隔離級別之前,先說下共享鎖(讀鎖)和排他鎖(寫鎖)。
讀鎖S:若事務(wù)T對數(shù)據(jù)對象A加了讀鎖,其他事務(wù)可以對數(shù)據(jù)A再加讀鎖,但不能加寫鎖,直到釋放了數(shù)據(jù)A上的讀鎖。
寫鎖X:若事務(wù)T對數(shù)據(jù)對象A加了寫鎖,則只有事務(wù)T可以對數(shù)據(jù)A進行讀取和修改,其他事務(wù)只能等T事務(wù)釋放了數(shù)據(jù)的寫鎖才可以對數(shù)據(jù)A進行操作。
讀未提交Read uncommitted
該隔離級別下,所有事務(wù)都可以讀取到其他事務(wù)沒有提交的處理結(jié)果。很少用于實際應(yīng)用,因為不能保證數(shù)據(jù)的一致性。
讀已提交Read committed
大多數(shù)數(shù)據(jù)庫采用的默認隔離級別,如Oracle。讀已提交隔離級別下,讀取不加鎖,寫加鎖,即數(shù)據(jù)的刪除、修改及寫入都需要加鎖,使得事務(wù)只能看到其他事務(wù)已經(jīng)提交的數(shù)據(jù),避免了臟讀。
可重復(fù)讀Repeated read
解決臟讀和不可重復(fù)讀的數(shù)據(jù)不一致性問題,保證同一事務(wù)的多個實例訪問數(shù)據(jù)時,讀到的結(jié)果是一致的。
串行化Serializable
完全串行化,讀操作加鎖,寫操作加鎖,讀寫鎖互相阻塞。這個隔離級別下,可能會造成大量的超時以及鎖競爭現(xiàn)象。