為了更好地說明事務隔離級別,請先移步快速理解髒讀、不可重複讀、幻讀
有四種隔離級別,分別是讀未提交(read uncommitted),讀已提交(read committed),可重複讀(repeatable read),可序列化(serializable),用來解決資料庫操作中產生的各種問題。
在這種隔離級別下,所有事務能夠讀取其他事務未提交的資料。讀取其他事務未提交的資料,會造成髒讀。因此在該種隔離級別下,不能解決髒讀、不可重複讀和幻讀。
讀未提交可能會產生髒讀的現象,那麼怎麼解決髒讀呢?那就是使用讀已提交。
在這種隔離級別下,所有事務只能讀取其他事務已經提交的內容。能夠徹底解決髒讀的現象。但在這種隔離級別下,會出現乙個事務的前後多次的查詢中卻返回了不同內容的資料的現象,也就是出現了不可重複讀。
注意這是大多數資料庫系統預設的隔離級別,例如oracle和sql server,但mysql不是。
已提交可能會產生不可重複讀的現象,我們可以使用可重複讀。
在這種隔離級別下,所有事務前後多次的讀取到的資料內容是不變的。也就是某個事務在執行的過程中,不允許其他事務進行update操作,但允許其他事務進行add操作,造成某個事務前後多次讀取到的資料總量不一致的現象,從而產生幻讀。
注意這才是mysql的預設事務隔離級別
可重複讀依然會產生幻讀的現象,此時我們可以使用序列化來解決。
在這種隔離級別下,所有的事務順序執行,所以他們之間不存在衝突,從而能有效地解決髒讀、不可重複讀和幻讀的現象。但是安全和效率不能兼得,這樣事務隔離級別,會導致大量的操作超時和鎖競爭,從而大大降低資料庫的效能,一般不使用這樣事務隔離級別。
隔離級別
髒讀
不可重複讀
幻讀
讀未提交(read uncommitted) ×
(未解決) ×
×讀已提交(read committed) √
(解決) ×
×可重複讀(repeatable read) √
√ ×可序列化(serializable) √
√ √當然,以上的內容是一種規範,不同的資料庫廠商可以有不同的實現。例如在mysql的可重複讀的級別上,使用間隙鎖的方式就已經解決了幻讀的問題。詳細的加鎖處理過程可以參考這篇文章【資料庫】mysql 加鎖處理分析
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...