1. 程式人生 > >《HighPerformance MySQL》概譯 隔離等級

《HighPerformance MySQL》概譯 隔離等級

隔離等級

隔離其實比它看起來複雜。SQL標準定義了四種隔離級別,決定了資料變化在事務內外可見或不可見。低級別的隔離等級會有更好的併發支援和更低的資源消耗。

     每種儲存引擎都有其獨特的隔離等級實現方式。你應該從你使用的儲存引擎的手冊中獲取更詳細的資訊。

下面讓我們來看下四種隔離等級:

未提交讀(READ UNCOMMITED)

允許事物讀取未提交的事物的結果。也就是允許髒讀。這個級別在實際環境中很少使用,因為它可能會帶來很多問題,並且效能比其他級別並沒有好多少。未提交讀,也被稱為髒讀。

提交讀(READ COMMITED)

大多數資料庫的預設隔離級別(但不是MySQL的!)它滿足之前提到的隔離定義:事物僅可以看到其它事務已經提交的資料。它自身的資料也只有在提交後才能被讀到。也被成為不重複讀(nonrepeatable read)。意味著,你運行同一個查詢兩次,可能讀到不同的資料。

重複讀(REPEATABLE READ)

解決了不提交讀的問題。事務讀取到的行在同一事務內部其他查詢讀取的時候都是一樣的。不過,這也帶來其他問題:幻象讀。(phantom reads)。當你正在讀取一些行的時候,另外的事務插入了資料,你再次讀取的時候,會讀到新插入的行。就好像“幻象”行一樣。InnoDB和XtraDB通過多版本併發管理解決了幻象讀的問題,後續我們會介紹。

重複讀是MySQL事務的預設隔離級別。

序列讀(SERIALIZABLE)

最高級別的隔離。序列讀強制要求事務順序執行,從而避免了衝突解決上述問題。從內部來看,序列讀給每個讀取的行加了鎖。在該級別下,會發生很多的超時和鎖競爭。很少見到有人使用該級別,不過這取決與你的業務需求是否苛刻。

下表列出不同隔離級別的概要和缺點

Table 1-1. ANSI SQL 隔離級別

隔離級別

是否允許髒讀

是否允許不重複讀

是否允許幻象讀

讀鎖

未提交讀

提交讀

重複讀

序列讀