Sql Server隔離級別(2)

Sql Server2005以後,引入了一個新的隔離級別Snapshot(Read Committed Snapshot Isolation (RCSI))和(Snapshot Isolation (SI))html

 

在以前的Sql Server隔離級別(1)中提到的四種隔離級別,除了Read Uncommitted以外,其餘的三個隔離級別都會阻塞其餘事務的執行(寫鎖會阻塞讀鎖,讀鎖也會阻塞寫鎖)。sql

這樣帶來的問題是啓用這三個隔離級別將會形成性能的損失和併發量的降低,爲了提供更好的併發量而且保持必定的數據一致性,Snapshot應運而生。數據庫

若是啓用了Snapshot隔離,數據庫會爲提交的數據創建一個版本信息放在tempdb裏。當一個事務開始的時候,會先從tempdb中讀取最近一次提交的數據版本,這樣就避免了讀取的操做被寫鎖阻塞。併發

因此使用這個隔離級別,會帶來更大的硬盤開銷。當一個事務運行在Snapshot這個隔離級別下,爲了維護版本信息,其餘事務對數據的大量更新會致使tempdb中存儲的版本信息很是多,不過SQL Server會將當前操做再也不須要的版本信息從tempdb中刪除。性能

而開頭提到的Read Committed Snapshot Isolation (RCSI)和Snapshot Isolation (SI)都是使用相同的機制來實現數據的版本控制。不過一般會推薦使用Read Committed Snapshot Isolation (RCSI),相比Snapshot Isolation (SI)有以下好處。spa

1:Read Committed Snapshot Isolation (RCSI)只須要在數據庫中開啓相應配置便可,不須要改動現有的數據庫代碼,就能夠從默認的Read Committed變成Read Committed Snapshot Isolation,讀取操做將不會再被寫操做阻塞。而Snapshot Isolation (SI)則須要在一個事務開始以前顯示的聲明。翻譯

2:Read Committed Snapshot Isolation (RCSI)的開銷比Snapshot Isolation (SI)小,由於當一條語句結束以後,SQL  Server將不會再爲該語句維護行版本信息。而Snapshot Isolation (SI)是對一個事務的聲明,對於運行比較久的事務,SQL Server須要在這個期間一直維護版本信息,對應產生的版本數據也就會很是多。版本控制

使用這兩個隔離級別的方法以下:code

Snapshot Isolation (RCSI):server

在數據庫中打開對應的配置便可

ALTER DATABASE DBNAME
SET READ_COMMITTED_SNAPSHOT ON

Snapshot Isolation (SI):

在數據庫中打卡對應的配置,而且須要將一個事務的隔離級別顯示聲明爲Snapshot

ALTER DATABASE DBNAME
SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
    --Statement
END TRAN

本文基本上是對如下文章的理解和翻譯,有興趣的同窗能夠繼續看看原文

http://msdn.microsoft.com/en-us/library/ms188277.aspx

http://www.databasejournal.com/features/mssql/snapshot-isolation-level-in-sql-server-what-why-and-how-part-1.html

http://www.databasejournal.com/features/mssql/snapshot-isolation-level-in-sql-server-what-why-and-how-part-2.html

相關文章
相關標籤/搜索