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 有一个非常悲观的锁定策略。为了提高性能,我应该更改锁定的已提交读快照。

但我找不到在哪里执行此操作。我在哪里更改锁定策略?

4

3 回答 3

5

您可以阅读Using Row Versioning-based Isolation Levels以及有关如何使用 ALTER 命令设置它们的示例。

它在数据库级别设置如下:

ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON;

更好的起点是上述文档的父级,其中涵盖了相关主题:数据库引擎中基于行版本控制的隔离级别

编辑:添加了我在下面的评论中提到的链接。

于 2009-08-31T07:53:49.087 回答
1

随着数据库负载的增加,使用 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 数据库中删除。

于 2009-08-31T09:13:31.813 回答
0

您可以在设置与数据库的连接时设置锁隔离级别,方法是调用

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

在我工作的地方,我们为我们设置的每个连接都这样做,它们都设置在同一个地方,因为我们使用共享连接池来访问数据库。然后,READ UNCOMMITTED 选项适用于该连接发出的所有语句。

于 2009-08-31T10:16:49.673 回答