是否可以在SQL Server中强制执行行级锁定?

时间:2010-06-25 00:23:39

标签: sql-server sql-server-2005 sql-server-2008 rowlocking

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

3 个答案:

答案 0 :(得分:31)

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

From the doco

  

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

请参阅    - Controlling SQL Server with Locking and Hints