2009-08-31 70 views
5

我讀過的文章像這樣的: http://www.codinghorror.com/blog/archives/001166.html http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htm如何更改SQL Server中的鎖定策略?

而且從我個人理解,SQL Server有一個非常悲觀鎖定策略。爲了提高性能,我應該更改鎖定讀取提交快照。

但我找不到在哪裏做到這一點。我在哪裏更改鎖定策略?

回答

5

您可以在Using Row Versioning-based Isolation Levels上閱讀關於如何使用ALTER命令設置它們的示例。

ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON; 

一個更好的起點是上述文件,涵蓋相關主題的父:Row Versioning-based Isolation Levels in the Database Engine

它設置如下在數據庫級別。

編輯:添加鏈接在我的評論下面提到。

+0

好的,但是我怎麼看到哪個是當前的隔離級別? 這個隔離級別是否僅適用於在事務中運行的查詢或所有查詢? – Allrameest

+1

您可以運行DBCC USEROPTIONS,並且返回的項目之一將是「隔離級別」的當前設置。這是MSDN鏈接:http://msdn.microsoft.com/en-us/library/ms180065。aspx –

+0

關於問題的第二部分,要利用事務中的隔離級別,您需要在「BEGIN TRAN」語句之前使用「SET TRANSACTION ISOLATION LEVEL SNAPSHOT」進行專門設置​​。因此,我的理解是它隻影響你明確聲明的事務查詢。一個例子就是上面的鏈接。一篇很好的文章解釋這個也可以在這裏閱讀:http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htm –

1

使用SNAPSHOT隔離級別會在數據庫負載增加時爲tempdb增加大量負載。

更改鎖定方法最好通過查詢中的鎖定提示或通過更改存儲過程或連接的「隔離級別」來完成。這是通過SET ISOLATION LEVEL命令完成的,或者通過在.NET中更改連接對象的隔離級別來完成。

如果您希望SQL Server通過在您的內部使用WITH(ROWLOCK)提示,通過語句級別在語句上處理的默認頁級別(即行級鎖定)以外的級別處理其鎖定聲明。

UPDATE YourTable (WITH ROWLOCK) 
    SET Col2 = 3 
WHERE Col1 = 'test' 

還有就是要改變這種鎖定級別的全局設置,如果ROWLOCK是結合使用快照隔離級別的操作還是會發生在頁面級別爲整個頁面已被複制過的然後更新tempdb數據庫,然後必須從tempdb數據庫中刪除舊版本。

+0

-1您不能通過SET ISOLATION LEVEL選擇「READ_COMMITTED_SNAPSHOT」或通過.NET連接對象。你必須修改數據庫,就像Ahmad Mageed的回答一樣。 – Andomar

+0

@Andomar是的,如果您打算使用SNAPSHOT,您必須在數據庫級別啓用它。對於交易使用它,您仍然必須使用SET TRANSACTION ISOLATION LEVEL SNAPSHOT作爲該事務的隔離級別,以使用SNAPSHOT而不是READ COMMITTED,這總是默認設置。 – mrdenny

0

您可以設置鎖定隔離級別,當你建立與數據庫的連接,通過調用

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

我在哪裏工作,我們爲我們設置了每個連接做到這一點,他們都設立在與我們使用共享連接池訪問數據庫的位置相同。 READ UNCOMMITTED選項適用於該連接發佈的所有語句。

+0

嗯,我不會推薦在整個電路板上設置'READ UNCOMMITTED' - 這取決於你對數據庫的使用。 SQL Server 2005+支持快照隔離,其基本版本與Oracle的工作方式類似。 – pjp

+0

您將「Read Committed Snapshot」讀取爲「Read Uncommitted」,令人困惑。前者是一個相對未知的設置,您不能選擇「設置事務隔離級別」,請參閱Ahmad Mageed的帖子。 – Andomar