我已阅读过以下文章:http://www.codinghorror.com/blog/archives/001166.htmlhttp://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htm
据我了解,SQL Server具有非常悲观的锁定策略。为了提高性能,我应该更改锁定的“已提交读快照”。
但是我找不到在哪里做。在哪里可以更改锁定策略?
您可以阅读Using Row Versioning-based Isolation Levels,并附带有关如何使用ALTER命令进行设置的示例。
它在数据库级别设置如下:
ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON;
一个更好的起点是上述文档的父文档,该文档涵盖了相关主题:Row Versioning-based Isolation Levels in the Database Engine。
编辑:添加了下面我的评论中提到的链接。
随着数据库负载的增加,使用SNAPSHOT隔离级别将为tempdb增加很多负载。
更改锁定方法最好通过查询中的锁定提示或通常通过更改存储过程或连接的ISOLATION LEVEL来完成。这是通过SET ISOLATION LEVEL命令或通过更改.NET中连接对象的隔离级别来完成的。
如果您希望SQL Server在默认页面级别(即行级别锁定)之外的级别上处理其锁定,则必须在语句中使用语句内的WITH(ROWLOCK)提示在语句级别上处理该锁定。
UPDATE YourTable WITH (ROWLOCK)
SET Col2 = 3
WHERE Col1 = 'test'
没有全局设置可以更改此锁定级别,并且如果将ROWLOCK与快照隔离级别结合使用,则操作仍将在页面级别进行,因为必须将整个页面复制到tempdb数据库中,然后进行更新,然后必须从tempdb数据库中删除旧版本。
您可以通过调用来设置与数据库的连接时设置锁定隔离级别
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
在我工作的地方,我们为建立的每个连接都执行此操作,它们都位于同一位置,因为我们使用共享连接池来访问数据库。然后,READ UNCOMMITTED选项适用于该连接发出的所有语句。