前一個文章講述了事務(wù)ACID的特性以及并發(fā)事務(wù)造成的數(shù)據(jù)不一致性問題,事務(wù)ACID以及不一致性問題驯耻,接下來講解下MySQL中隔離級別。
MySQL隔離級別
因?yàn)樯鲜龅膸讉€數(shù)據(jù)不一致性問題思杯,MySQL主要提供了四個隔離級別來解決這些問題凑兰,用一個表格來描述各個隔離級別解決的以及還存在的不一致問題。
(??表示還是有這種現(xiàn)象遣蚀,??表示不會出現(xiàn)這個問題)
隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
讀未提交 | ?? | ?? | ?? |
讀已提交 | ?? | ?? | ?? |
可重復(fù)讀 | ?? | ?? | ?? |
串行化 | ?? | ?? | ?? |
串行化的隔離級別最高矾麻,讀未提交的隔離級別最低。隔離級別越高芭梯,說明事務(wù)的并發(fā)度越低险耀,當(dāng)然執(zhí)行效率也越低。接下來具體講解下這幾個隔離級別玖喘,應(yīng)用中根據(jù)實(shí)際情況來選擇隔離級別甩牺,MySQL默認(rèn)隔離級別為可重復(fù)讀,可以通過以下命令查看系統(tǒng)級累奈、會話級的默認(rèn)隔離級別贬派。
講隔離級別之前,先說下共享鎖(讀鎖)和排他鎖(寫鎖)澎媒。
讀鎖S:若事務(wù)T對數(shù)據(jù)對象A加了讀鎖搞乏,其他事務(wù)可以對數(shù)據(jù)A再加讀鎖,但不能加寫鎖戒努,直到釋放了數(shù)據(jù)A上的讀鎖请敦。
寫鎖X:若事務(wù)T對數(shù)據(jù)對象A加了寫鎖,則只有事務(wù)T可以對數(shù)據(jù)A進(jìn)行讀取和修改,其他事務(wù)只能等T事務(wù)釋放了數(shù)據(jù)的寫鎖才可以對數(shù)據(jù)A進(jìn)行操作侍筛。
讀未提交Read uncommitted
該隔離級別下萤皂,所有事務(wù)都可以讀取到其他事務(wù)沒有提交的處理結(jié)果。很少用于實(shí)際應(yīng)用勾笆,因?yàn)椴荒鼙WC數(shù)據(jù)的一致性敌蚜。
讀已提交Read committed
大多數(shù)數(shù)據(jù)庫采用的默認(rèn)隔離級別,如Oracle窝爪。讀已提交隔離級別下弛车,讀取不加鎖,寫加鎖蒲每,即數(shù)據(jù)的刪除纷跛、修改及寫入都需要加鎖,使得事務(wù)只能看到其他事務(wù)已經(jīng)提交的數(shù)據(jù)邀杏,避免了臟讀贫奠。
可重復(fù)讀Repeated read
解決臟讀和不可重復(fù)讀的數(shù)據(jù)不一致性問題,保證同一事務(wù)的多個實(shí)例訪問數(shù)據(jù)時望蜡,讀到的結(jié)果是一致的唤崭。
串行化Serializable
完全串行化,讀操作加鎖脖律,寫操作加鎖谢肾,讀寫鎖互相阻塞。這個隔離級別下小泉,可能會造成大量的超時以及鎖競爭現(xiàn)象芦疏。