我可以看到如何关闭SQL Server中的行级和页级锁定,但我找不到强制SQL Server使用行级锁定的方法。有没有办法强制SQL Server使用行级锁定而不使用页级锁定?
答案 0 :(得分:31)
您可以使用ROWLOCK提示,但如果资源不足,AFAIK SQL可能会决定对其进行升级
ROWLOCK指定行锁定 在页面或表锁定时采取 通常采取。在指定时 在SNAPSHOT运营的交易 隔离级别,行锁不是 除非与ROWLOCK结合使用 其他需要锁的表提示, 例如UPDLOCK和HOLDLOCK。
和
锁定提示ROWLOCK,UPDLOCK和XLOCK 获取行级锁可能会放置 锁定索引键而不是 实际数据行。例如,如果是 table有一个非聚集索引,和一个 使用锁提示的SELECT语句是 由覆盖索引处理,锁是 获取在索引键上 覆盖索引而不是数据 基表中的行。
And finally这给出了SQL Server 2005中的锁升级的深入解释,该升级在SQL Server 2008中已更改。
还有,非常深入:Locking in The Database Engine(在线书籍)
所以,一般来说
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
应该没问题,但根据服务器上的索引和负载,它可能最终升级为页锁。
答案 1 :(得分:13)
使用ALTER/CREATE INDEX的ALLOW_PAGE_LOCKS子句:
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
答案 2 :(得分:8)
您无法强制优化器执行任何操作,但您可以指导它。
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93