我可以看到如何在 SQL Server 中关闭行级和页级锁定,但我找不到强制 SQL Server 使用行级锁定的方法。有没有办法强制 SQL Server 使用行级锁定而不使用页级锁定?
问问题
115960 次
3 回答
34
您可以使用 ROWLOCK 提示,但如果资源不足,AFAIK SQL 可能会决定升级它
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 回答