我可以看到如何关闭SQL Server中的行级别和页面级锁定,但是我找不到一种迫使SQL Server使用行级锁定的方法。有没有办法强制SQL Server使用行级锁定并且不使用页面级锁定?

有帮助吗?

解决方案

您可以使用Rowlock提示,但是如果AFAIK SQL在资源上运行较低,则可以决定升级

来自doco:

Rowlock指定通常采用页面或表锁时采用行锁。如果在快照隔离级别运行的交易中指定时,除非将ROWLOCK与其他需要锁的表提示(例如updlock and Holdlock)结合使用,否则不会采取行锁。

锁定提示ROWLOCK,UPDLOCK和XLOCK,获取行级锁可能会将锁定在索引键而不是实际数据行上。例如,如果表具有非集群索引,并且使用锁定提示的选择语句由封面索引处理,则在封面索引中的索引密钥上,而不是基本表中的数据行中获取锁定。

最后 这给出了有关SQL Server 2005中锁定升级的非常深入的解释,该解释在SQL Server 2008中进行了更改。

还有一个深度: 锁定数据库引擎 (在线书中)

因此,总的来说

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

应该可以,但是根据索引和服务器上的加载,它最终可能会升级为页面锁定。

其他提示

使用允许_page_locks子句 更改/创建索引:

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);

您不能真正强迫优化器执行任何操作,但是您可以指导它。

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

看 - 用锁定和提示控制SQL Server

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top