下面簡單地介紹一下四種隔離級別。
read uncommitted (未提交讀)
在read uncommited級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀(dirty read)。這個級別會導致很多問題,從效能上來說,read uncommitted 不會比其他的級別好太多,但卻缺乏其他級別的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。
read committed (提交讀)
大多數資料庫系統的預設隔離級別都是read comitted (但mysql 不是)。readcommitted滿足前面提到的隔離性的簡單定義:乙個事務開始時,只能「看見」已經提交的事務所做的修改。 換句話說,乙個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重複讀(nonrepeatableread),因為兩次執行同樣的查詢, 可能會得到不一樣的結果。
repeatable read (可重複讀) repeatable read解決了髒讀的問題。該級別保證了在同乙個事務中多次讀取同樣記錄的結果是一致的。但是理論上,可重複讀隔離級別還是無法解決另外乙個幻讀(phantom read) 的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外乙個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時 ,會產生幻行(phantom row)。innodb 和xtradb 儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control) 解決了幻讀的問題。本章稍後會做進一步的討論。
可重複讀是mysql 的預設事務隔離級別。
serializable (可序列化) serializable是最高的隔離級別。它通過強制事務序列執行,避免了前面說的幻讀的問題。簡單來說, serializable 會在讀取的每一行資料上都加鎖,所以可能導致大量的超時和鎖爭用的問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下,才考慮採用該級別。
資料庫隔離級別
read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...
資料庫隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀 不可重複讀 幻讀read uncommitted re...
資料庫隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...