今天總算是搞明白了可重復讀這種隔離級別中說的幻讀是什么意思。然后把數(shù)據(jù)庫的四種隔離級別整理一下:
在SQL標準中定義了四種隔離級別证薇,每一種級別都規(guī)定了一個事務中所做的修改度苔,哪些在事務內和事務間是可見的,哪些是不可見的浑度。
一共有四種隔離級別寇窑,從低到高依次為:read uncommitted(未提交讀), read commited(提交讀), repeatable read(可重復讀)箩张,serializable(可串行化)
較低的隔離級別支持可以執(zhí)行更高的并發(fā)甩骏,和更小的系統(tǒng)開銷
未提交讀級別:事務中的修改,即使沒有提交先慷,對其他事務也都是可見的饮笛。事務能讀取未提交的數(shù)據(jù),也被稱作臟讀熟掂,這個級別會導致很多問題缎浇,在實際應用中一般不會用到。
提交讀級別:解決了未提交讀級別的臟讀問題赴肚。一個事務開始時素跺,只能看見已經提交的事務所做的修改。換句話說誉券,一個事務從開始直到提交之前指厌,所做的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重復讀踊跟,因為同一個事務中兩次執(zhí)行同樣的查詢踩验,可能會得到不一樣的結果鸥诽。(恰好在兩次查詢之間的時間,其他某個事務完成了對數(shù)據(jù)的更新)箕憾。
可重復讀級別:上面的提交讀級別解決了未提交讀級別的臟讀問題牡借,但是無法保證在一個事務中兩次讀到同樣記錄的結果是一致的。此可重復讀級別解決了此問題袭异,能保證在同一個事務中钠龙,兩次讀取同樣的記錄結果是一致的。但是可重復讀級別不能解決幻讀的問題御铃〔昀铮幻讀是指當某個事務在讀取某個范圍內的記錄時,會產生幻行上真。(幻行可通過樂觀鎖和悲觀鎖來解決)咬腋。
可串行化級別:是最高級別,它通過強制事務串行化執(zhí)行睡互,避免了前面說的幻讀的問題根竿。但是會導致大量的超時和鎖競爭的問題。
臟讀:一行記錄湃缎,兩次讀取結果不一樣
幻讀:一個范圍的記錄(幾條記錄)犀填,兩次讀取的記錄條數(shù)不一樣,通常是指多幾條
提交讀(不可重復讀)級別解決了臟讀問題嗓违,但存在不可重復讀問題九巡。
可重復讀級別解決了可重復讀問題,但是存在幻讀問題
串行化級別解決了幻讀問題蹂季。