58

我可以看到如何在 SQL Server 中关闭行级和页级锁定,但我找不到强制 SQL Server 使用行级锁定的方法。有没有办法强制 SQL Server 使用行级锁定而不使用页级锁定?

4

3 回答 3

34

您可以使用 ROWLOCK 提示,但如果资源不足,AFAIK SQL 可能会决定升级它

从 doco

ROWLOCK 指定在通常采用页锁或表锁时采用行锁。在以 SNAPSHOT 隔离级别操作的事务中指定时,除非 ROWLOCK 与其他需要锁的表提示(例如 UPDLOCK 和 HOLDLOCK)结合使用,否则不会采用行锁。

获取行级锁的锁提示 ROWLOCK、UPDLOCK 和 XLOCK 可能会将锁放在索引键上,而不是实际的数据行上。例如,如果表具有非聚集索引,并且使用锁定提示的 SELECT 语句由覆盖索引处理,则会在覆盖索引中的索引键上获取锁定,而不是在基表中的数据行上获取锁定。

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

还有非常深入的:锁定数据库引擎(在线书籍中)

所以,总的来说

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

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

于 2010-06-25T00:25:27.683 回答
15

使用ALTER/CREATE INDEX的 ALLOW_PAGE_LOCKS 子句:

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
于 2010-06-25T00:39:05.767 回答
8

你不能真正强迫优化器做任何事情,但你可以引导它。

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

请参阅 -使用锁定和提示控制 SQL Server

于 2010-06-25T00:29:24.540 回答