SQLServer事務隔離級別


數據庫中的事物是具有原子性(Atomicity),一致性(Consistemcy),隔離性(Isolation),持久性(Durability)四個特征。

1、原子性(Atomicity):事務中的全部操作在數據庫中是不可分割的,要么全部完成,要么全部不執行。

2、一致性(Consistency):幾個並行執行的事務,其執行結果必須與按某一順序 串行執行的結果相一致。

3、奪隔離性(Isolation):事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的。

4、奪持久性(Durability):對於任意已提交事務,系統必須保證該事務對數據庫的改變不被丟失,即使數據庫出現故障。

事務的ACID特性是由關系數據庫系統(DBMS)來實現的,DBMS采用日志來保證事務的原子性、一致性和持久性。日志記錄了事務對數據庫所作的更新,如果某個事務在執行過程中發生錯誤,就可以根據日志撤銷事務對數據庫已做的更新,使得數據庫同滾到執行事務前的初始狀態。 對於事務的隔離性,DBMS是采用鎖機制來實現的。當多個事務同時更新數據庫中相同的數據時,只允許持有鎖的事務能更新該數據,其他事務必須等待,直到前一個事務釋放了鎖,其他事務才有機會更新該數據。

一致性和隔離性是通過鎖來實現對相同數據的訪問隔離的實現。事物的隔離級別又可以影響鎖的申請和時間的時機。

不同的事物隔離級別又可以對鎖的申請和釋放產生不同的影響,在對數據庫做事物控制的時候需要了解隔離級別對事物的影響。

事務隔離級別通過影響讀操作來間接地影響寫操作;可以在回話級別上設置事務隔離級別也可以在查詢(表級別)級別上設置事務隔離級別。

SQL Server實現SQL99標准規定的事務的四個隔離級別(未提交讀,已提交讀,可重復讀,序列化)之外,另外增加了兩個隔離級別(快照和基於行版本的已提交讀隔離級別)。

不同的隔離級別對控制臟讀,不可重復讀,幻讀有一定的控制,也會並發有一定程度的影響,隔離級別越低,並發性越高,但是產生臟讀,不可重復讀,幻讀等可能性越大;隨着事物隔離級別的提交,可以控制臟讀,不可重復讀,以及幻讀的現象,但是並發性也會隨之降低。事物隔離級別和執行計划都可以影響鎖(范圍)的申請和釋放時機,本文暫不討論執行計划對鎖申請的影響,僅在隔離級別上說明鎖的申請和釋放。

數據庫事務的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決臟讀、不可重復讀、幻讀這幾類問題。 隔離級別越高,讀操作的請求鎖定就越嚴格,鎖的持有時間久越長;所以隔離級別越高,一致性就越高,並發性就越低,同時性能也相對影響越大.

 

臟讀:事務A向表中插入了一條數據,此時事務A還沒有提交,此時查詢語句能把這條數據查詢出來,這種現現象稱為臟讀;臟讀比較好理解

不可重復讀:一個事務A第一次讀取的結果之后,  另外一個事務B更新了A事務讀取的數據,A事務在第二次讀取的結果和第一次讀取的結果不一樣這種現象稱為不可重復讀

幻讀:事務A查詢表里面的所有數據,這時事務B向表中插入了一條數據,這時事務A第一次的查詢結果和第二次的查詢結果不一致,這種現象我稱為幻讀。

 

一.第1級別:Read Uncommitted(讀取未提交內容) 相當於with(nolock)

(1)所有事務都可以看到其他未提交事務的執行結果;

(2)本隔離級別很少用於實際應用,因為它的性能也不比其他級別好多少;

(3)該級別引發的問題是——臟讀(Dirty Read):讀取到了未提交的數據。

二.第2級別:Read Committed(讀取提交內容)

(1)這是大多數數據庫系統的默認隔離級別(Oracle和SQLServer默認的);

(2)它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變;

(3)這種隔離級別出現的問題是——不可重復讀(Nonrepeatable Read):不可重復讀意味着我們在同一個事務中執行完全相同的select語句時可能看到不一樣的結果。

導致這種情況的原因可能有:

(1)有一個交叉的事務有新的commit,導致了數據的改變;

(2)一個數據庫被多個實例操作時,同一事務的其他實例在該實例處理其間可能會有新的commit。

三.第3級別:Repeatable Read(可重復讀)相當於(HOLDLOCK)

(1)這是MySQL的默認事務隔離級別;

(2)它確保同一事務的多個實例在並發讀取數據時,會看到同樣的數據行;

(3)此級別可能出現的問題——幻讀(Phantom Read):當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行;

(4)InnoDB和Falcon存儲引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。

四.第4級別:Serializable(可序列化)

(1)這是最高的隔離級別;

(2)它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題;簡言之,它是在每個讀的數據行上加上共享鎖;

(3)在這個級別,可能導致大量的超時現象和鎖競爭。

五.:Snapshot(快照)

(1)SNAPSHOT 在SNAPSHOT隔離級別下,當讀取數據時可以保證操作讀取的行是事務開始時可用的最后提交版本

(2)同時SNAPSHOT隔離級別也滿足前面的已提交讀,可重復讀,不幻讀;該隔離級別實用的不是共享鎖,而是行版本控制

六.Read Committed  Snapshot(已提交讀快照)

READ COMMITTED SNAPSHOT也是基於行版本控制,但是READ COMMITTED SNAPSHOT的隔離級別是讀操作之前的最后已提交版本,而不是事務前的已提交版本,有點類似前面的READ COMMITTED能保證已提交讀,但是不能保證可重復讀,不能避免幻讀,但是又比 READ COMMITTED隔離級別多出了不需要獲取共享鎖就可以讀取數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM