是否有可能在SQL Server中强制行级locking?

我可以看到如何closuresSQL Server中的行级别和页面级别locking,但我找不到强制SQL Server使用行级别locking的方法。 有没有办法强制SQL Server使用行级locking,而不是使用页级locking?

您可以使用ROWLOCK提示,但AFAIK SQL可能决定在资源不足时将其升级

从doco :

ROWLOCK指定在正常执行页面locking或表格locking时执行行locking。 在以SNAPSHOT隔离级别运行的事务中指定时,不会执行行locking,除非ROWLOCK与需要locking的其他表提示(例如UPDLOCK和HOLDLOCK)结合使用。

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

最后 ,对SQL Server 2005中更改的SQL Server 2005中的锁升级给出了一个非常深入的解释。

还有一个非常深入的问题: locking数据库引擎 (在线书籍)

所以一般来说

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

应该没问题,但根据服务器上的索引和加载情况,最终可能升级到页面locking。

使用ALTER / CREATE INDEX的ALLOW_PAGE_LOCKS子句:

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

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

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

请参阅 – 使用locking和提示控制SQL Server

Interesting Posts