官术网_书友最值得收藏!

隔離級別

隔離性在實際操作中比看起來復雜得多。ANSI SQL標準定義了4種隔離級別。如果你是數據庫領域的新手,我們強烈建議你在閱讀特定的MySQL實現之前先熟悉ANSI SQL[6]的通用標準。這個通用標準的目標是定義在事務內外可見和不可見的更改的規則。較低的隔離級別通常允許更高的并發性,并且開銷也更低。

每種存儲引擎實現的隔離級別都不盡相同。如果你熟悉其他的數據庫產品,可能會發現某些特性和你期望的會有些不一樣(因此本節不打算討論更詳細的內容)。讀者可以根據所選擇的存儲引擎,查閱相關的手冊。

下面簡單地介紹一下這4種隔離級別。

READ UNCOMMITTED(未提交讀)

在READ UNCOMMITTED級別,在事務中可以查看其他事務中還沒有提交的修改。這個隔離級別會導致很多問題,從性能上來說,READ UNCOMMITTED不會比其他級別好太多,卻缺乏其他級別的很多好處,除非有非常必要的理由,在實際應用中一般很少使用。

讀取未提交的數據,也稱為臟讀(dirty read)。

READ COMMITTED(提交讀)

大多數數據庫系統的默認隔離級別是READ COMMITTED(但MySQL不是)。READ COMMITTED滿足前面提到的隔離性的簡單定義:一個事務可以看到其他事務在它開始之后提交的修改,但在該事務提交之前,其所做的任何修改對其他事務都是不可見的。這個級別仍然允許不可重復讀(nonrepeatable read),這意味著同一事務中兩次執行相同語句,可能會看到不同的數據結果。

REPEATABLE READ(可重復讀)

REPEATABLE READ解決了READ COMMITTED[7]級別的不可重復讀問題,保證了在同一個事務中多次讀取相同行數據的結果是一樣的。但是理論上,可重復讀隔離級別還是無法解決另外一個幻讀(phantom read)的問題。所謂幻讀,指的是當某個事務在讀取某個范圍內的記錄時,另外一個事務又在該范圍內插入了新的記錄,當之前的事務再次讀取該范圍的記錄時,會產生幻行(phantom row)。InnoDB和XtraDB存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問題。本章稍后會對此做進一步討論。

REPEATABLE READ是MySQL默認的事務隔離級別。

SERIALIZABLE(可串行化)

SERIALIZABLE是最高的隔離級別。該級別通過強制事務按序執行,使不同事務之間不可能產生沖突,從而解決了前面說的幻讀問題。簡單來說,SERIALIZABLE會在讀取的每一行數據上都加鎖,所以可能導致大量的超時和鎖爭用的問題。實際應用中很少用到這個隔離級別,除非需要嚴格確保數據安全且可以接受并發性能下降的結果。

表1-1概述了這幾種隔離級別之間的利與弊。

表1-1:ANSI SQL的隔離級別

主站蜘蛛池模板: 四子王旗| 拉萨市| 巍山| 九龙城区| 铜鼓县| 宜昌市| 大冶市| 廉江市| 泸西县| 平邑县| 霍山县| 正镶白旗| 读书| 河西区| 巴楚县| 巴南区| 虎林市| 武强县| 衢州市| 绥棱县| 江安县| 页游| 集贤县| 五河县| 新余市| 萨嘎县| 浠水县| 平泉县| 临城县| 佛冈县| 营山县| 黄山市| 龙口市| 锦州市| 汝州市| 建水县| 莱西市| 玉溪市| 花莲市| 霞浦县| 开化县|