定義
- SQL標準定義了4類隔離級別执桌,包括了一些具體規(guī)則;
- 用來限定事務內外的哪些改變是可見的,哪些是不可見的。
- 低級別的隔離級一般支持更高的并發(fā)處理搓幌,并擁有更低的系統(tǒng)開銷。
Read Uncommitted(讀取未提交內容)
- 在該隔離級別迅箩,所有事務都可以看到其他未提交事務的執(zhí)行結果;
- 本隔離級別很少用于實際應用溉愁,因為它的性能也不比其他級別好多少;
- 屬于
臟讀
;
Read Committed(讀取提交內容)
- 這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認隔離級別(但不是MySQL默認的);
- 它滿足了隔離的簡單定義:一個事務只能看見已經(jīng)提交事務所做的改變 ;
- 支持所謂的不可重復讀(Nonrepeatable Read)饲趋,因為同一事務的其他實例在該實例處理其間可能會有新的commit拐揭,所以同一select可能返回不同結果撤蟆。
Repeatable Read(可重讀)
- 這是MySQL的默認事務隔離級別;
- 它確保同一事務的多個實例在并發(fā)讀取數(shù)據(jù)時堂污,會看到同樣的數(shù)據(jù)行家肯。
- 不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)敷鸦。簡單的說息楔,幻讀指當用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務又在該范圍內插入了新行扒披,當用戶再讀取該范圍的數(shù)據(jù)行時值依,會發(fā)現(xiàn)有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC碟案,Multiversion Concurrency Control)機制解決了該問題愿险。
Serializable(可串行化)
- 這是最高的隔離級別,它通過強制事務排序价说,使之不可能相互沖突辆亏,從而解決幻讀問題。
- 簡言之鳖目,它是在每個讀的數(shù)據(jù)行上加上共享鎖扮叨。在這個級別,可能導致大量的超時現(xiàn)象和鎖競爭
以上四種隔離級別采取不同的鎖類型來實現(xiàn)领迈,若讀取的是同一個數(shù)據(jù)的話彻磁,就容易發(fā)生問題。例如:
- 臟讀(Drity Read):某個事務已更新一份數(shù)據(jù)狸捅,另一個事務在此時讀取了同一份數(shù)據(jù)衷蜓,由于某些原因,前一個RollBack了操作尘喝,則后一個事務所讀取的數(shù)據(jù)就會是不正確的磁浇。
- 不可重復讀(Non-repeatable read): 在一個事務的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數(shù)據(jù)朽褪。
- 幻讀(Phantom Read): 在一個事務的兩次查詢中數(shù)據(jù)筆數(shù)不一致置吓,例如有一個事務查詢了幾列(Row)數(shù)據(jù),而另一個事務卻在此時插入了新的幾列數(shù)據(jù)缔赠,先前的事務在接下來的查詢中衍锚,就會發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的。
在MySQL中橡淑,實現(xiàn)了這四種隔離級別构拳,分別有可能產(chǎn)生問題如下所示:

ioslation-level