1. 程式人生 > >Read Committed Snapshot和Snapshot Isolation

Read Committed Snapshot和Snapshot Isolation

這兩種隔離級別都是通過行版本控制在tempdb中生成資料的複本來解決資料的寫和讀的時候發生鎖及阻塞的問題的。不過snapshot isolation需要在資料庫中執行
ALTER DATABASE Aesop
SET ALLOW_SNAPSHOT_ISOLATION ON
之後,然後在執行事務之前,設定連線的隔離級別
SET TRANSACTION ISOLATION LEVEL Snapshot;
BEGIN TRAN
SELECT Title
FROM FABLE
WHERE FableID = 2
這時候當發生第二個事務對fableid=2的行進行更新的時候,它可以進行更新,但是在更新事務提交之後,查詢事務依然是無法查到更新事務所做的修改,它還是隻能查詢到原始的資料,這種情況類似於repeatable read隔離級別,但是在repeatable read下,更新事務是無法更新的,直到查詢事務提交之後才可以。

Read Committed Snapshot Isolation只是針對sqlserver預設的read committed隔離級別的。使用它需要執行如下sql:
ALTER DATABASE Aesop
SET READ_COMMITTED_SNAPSHOT ON
如果資料庫只是普通的read committed級別下,當執行一個更新事務但沒有提交時,再執行一個對更新資料進行查詢的事務,查詢事務將無法查詢,被阻塞,但是在 READ_COMMITTED_SNAPSHOT被開啟的情況下,在上面那種情況中,查詢事務將不會被阻塞,它能夠查詢到未更新前的資料。

說句最俗的,Snapshot Isolation是針對SET TRANSACTION ISOLATION LEVEL Snapshot;的,在使用的時候需要在事務前設定隔離級別,而Read Committed Snapshot Isolation完全不需要使用set transaction isolation,因為它是針對資料預設的read committed隔離級別的。