在 sql 標準中定義了四種隔離級別,每一種級別都規定了乙個事務中所做的修改,哪些在事務內和事務間是可見的,哪些是不可見的。較低階別的隔離通常可以執行更高的併發,系統的開銷也更低。
read uncommited(未提交讀)
在 read uncommitted 級別,事務中的修改,即使沒有提交,對其他事務也是可見的,事務可以讀取未提交的資料,這也被稱為髒讀(dirty read)。這個級別會導致很多問題,從效能上來說,read uncommited 不會比其他的級別好太多,但卻缺乏其他級別的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。
read committed(提交讀)
大多數資料庫系統的預設隔離級別都是 read commited(但 mysql 不是)。read commited 滿足前面提到的隔離性的簡單定義:乙個事務開始時,只能 「看見」 已經提交的事務所做的修改。換句話說,乙個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重複讀(norepeatable read),因為兩次執行同樣的查詢,可能會得到不一樣的結果。
repeatable read(可重複讀)
repeatable read 解決了髒讀的問題。該級別保證了在同乙個事務中多次讀取同樣記錄的結果是一致的。但是理論上,可重複讀隔離級別還是無法解決另外乙個幻讀(phantom read)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外乙個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍內的記錄時,會產生幻行(phantom row)。innodb 和 xtradb 儲存引擎通過多版本併發控制(mvcc,multiversions concurrency control)解決了幻讀的問題。
serializable(可序列化)
serializable 是最高的隔離級別。它強制事務序列執行,避免了前面說的幻讀的問題。簡單來說,serializable 會在讀取的每一行資料都加上鎖,所以可能導致大量的超時和鎖爭用的問題,實際應用中也很少用到這個隔離級別,只有在非常需要確保資料的一致性並且可以接受沒有併發的情況下,才考慮採用該級別。
事務四種隔離級別
1.讀取未提交 乙個事務可以讀取另乙個未提交的事務的資料。髒讀 2.讀取已提交 事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料做了更新並提交,導致事務a多次讀取同一資料時,結果不一致。不可重複度 對應update操作 3.可重複讀 開始讀取資料時 事務開啟時 不在允許修改操作。可能會...
四種事務的隔離級別
sql 標準定義的四個隔離級別為 read uncommitted 未提交讀 read committed 提交讀 repeatable read 可重複讀 serializable 可序列化 下面分別介紹。1 未提交讀 就是乙個事務可以讀取另乙個未提交事務的資料。1 開啟乙個客戶端a,並設定當前事...
事務的四種隔離級別
資料庫事務的隔離級別有4種,由低到高分別為read uncommitted read committed repeatable read serializable 在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。具體可參照該篇部落格 read uncommitted 讀未提交,即乙個事務可以讀取...