《HighPerformance MySQL》概譯 隔離等級
隔離等級
隔離其實比它看起來複雜。SQL標準定義了四種隔離級別,決定了資料變化在事務內外可見或不可見。低級別的隔離等級會有更好的併發支援和更低的資源消耗。
每種儲存引擎都有其獨特的隔離等級實現方式。你應該從你使用的儲存引擎的手冊中獲取更詳細的資訊。
下面讓我們來看下四種隔離等級:
未提交讀(READ UNCOMMITED)
允許事物讀取未提交的事物的結果。也就是允許髒讀。這個級別在實際環境中很少使用,因為它可能會帶來很多問題,並且效能比其他級別並沒有好多少。未提交讀,也被稱為髒讀。
提交讀(READ COMMITED)
大多數資料庫的預設隔離級別(但不是MySQL的!)它滿足之前提到的隔離定義:事物僅可以看到其它事務已經提交的資料。它自身的資料也只有在提交後才能被讀到。也被成為不重複讀(nonrepeatable read)。意味著,你運行同一個查詢兩次,可能讀到不同的資料。
重複讀(REPEATABLE READ)
解決了不提交讀的問題。事務讀取到的行在同一事務內部其他查詢讀取的時候都是一樣的。不過,這也帶來其他問題:幻象讀。(phantom reads)。當你正在讀取一些行的時候,另外的事務插入了資料,你再次讀取的時候,會讀到新插入的行。就好像“幻象”行一樣。InnoDB和XtraDB通過多版本併發管理解決了幻象讀的問題,後續我們會介紹。
重複讀是MySQL事務的預設隔離級別。
序列讀(SERIALIZABLE)
最高級別的隔離。序列讀強制要求事務順序執行,從而避免了衝突解決上述問題。從內部來看,序列讀給每個讀取的行加了鎖。在該級別下,會發生很多的超時和鎖競爭。很少見到有人使用該級別,不過這取決與你的業務需求是否苛刻。
下表列出不同隔離級別的概要和缺點
Table 1-1. ANSI SQL 隔離級別
隔離級別 |
是否允許髒讀 |
是否允許不重複讀 |
是否允許幻象讀 |
讀鎖 |
未提交讀 |
是 |
是 |
是 |
否 |
提交讀 |
否 |
是 |
是 |
否 |
重複讀 |
否 |
否 |
是 |
否 |
序列讀 |
否 |
否 |
否 |
是 |