本文作者:蘇生米沿
本文地址:[http://blog.csdn.net/sushengmiyan/article/details/50551741](http://blog.csdn.net/sushengmiyan/article/details/50551741)
當我們談起隔離的時候,我們總是假定兩個物體直接要么隔離要么不隔離;但是實際上,兩者直接沒有那么明顯的界限。
當我們說數據庫的事務的時候,完全隔離需要花費高的代價。你不能阻止世界用多用戶聯機事務處理系統獲取數據。
因此,有很多的隔離級別可以供我們選擇。當然,其中有些選項,是隔離級別較弱的,但是能提升性能和系統的伸縮性。
事務隔離級別
1.
2.
3.
事務隔離性問題
首先,我們看一下幾個消弱隔離性的幾個可能會出現的場景,ANSI SQL標準定義了幾個數據庫系統允許的隔離性級別。
圖11.1展示了更新丟失的問題:兩個對一行數據的更新同時進行,第一個更新先完成,第二個發生了異常,此時回滾,那么第一個修改的就會連帶回滾,數據丟失。這發生在沒有鎖的系統中,此時沒有隔離并發事務。
圖11.2展示了臟讀的發生情況: 臟讀取出現在一個事務讀另一個事務修改但是還沒有提交的數據的時候。這很危險,因為另一個事務進行的改變很可能會回滾,并且第一個事務可能會得到非法數據(and invalid?data may be written by the first transaction);
圖11.3展示了讀不重復數據的情況:這時,事務兩次讀取數據,并且兩次讀取的數據是不一致的。例如,兩次讀取的時候,另一個事務對其進行了更新,導致兩次讀取數據不一致。
圖11.4展示了后更新覆蓋先更新的問題:讀不重復的一個特殊情況就是后提交者獲勝。假設兩個并發的事務都讀取數據,一個更新它并提交,另一個也更新并提交,那么最終是以第二個更新為準的,第一個更新就被覆蓋了。這種情況對用戶來說是很有迷惑性的,A用戶在不被知曉的情況下,被B的數據覆蓋掉了,B通過一個過時的信息做出了決定。
圖11.5展示了幻讀的情況:這是說,在一個事物兩次查詢的過程中,有另一個事務,對其數據進行了刪除或者插入操作,兩次讀的就出現了不同的情況。
既然你知道了會發生的最壞的情況,我們將會定義隔離級別和看各種級別能解決哪些問題。