ROWLOCK在删除时的目的是什么,我应该何时使用它?

RPS*_*RPS 18 sql sql-server

例)

我应该何时使用此声明:

DELETE TOP (@count)
FROM ProductInfo WITH (ROWLOCK)
WHERE ProductId = @productId_for_del;
Run Code Online (Sandbox Code Playgroud)

什么时候应该只是做:

DELETE TOP (@count)
FROM ProductInfo
WHERE ProductId = @productId_for_del;
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 24

with (rowlock)是一个提示,指示数据库应该在行范围内保持锁定.这意味着数据库将避免将锁升级到块或表范围.

当查询仅影响单个行或仅几行时,可以使用提示,以防止锁定不会被查询删除的行.这将让另一个查询同时读取不相关的行,而不必等待删除完成.

如果在将删除大量行的查询上使用它,则可能会降低性能,因为数据库将尽量避免将锁升级到更大的范围,即使它更有效.

通常,您不需要向查询添加此类提示,因为数据库知道要使用哪种锁.仅在出现性能问题的情况下,因为数据库做出了错误的决定,您应该向查询添加此类提示.

  • 数据库应该能够自己做出决定。如果它看到一个很好的理由,它就会升级。我会避免否决它(这是提示所做的),除非我有充分的理由,比如我知道一些数据库不知道的东西。 (2认同)
  • [提示](https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-ver15): _“因为 SQL Server 查询优化器通常会为查询选择最佳执行计划,我们建议经验丰富的开发人员和数据库管理员仅使用提示作为最后的手段。”_ (2认同)

Cob*_*sve 6

行锁是一个查询提示,应谨慎使用(所有查询提示也是如此)。

省略它可能仍然会导致完全相同的行为,并且提供它不能保证仅使用行锁,毕竟这只是一个提示。如果您对锁争用没有很深入的了解,那么优化程序将选择最佳的锁策略,而这些事情通常最好由数据库引擎决定。

ROWLOCK表示执行删除操作时,SQL仅锁定受影响的行,而不锁定整个表或表中存储数据的页面。这只会影响其他人在删除操作运行的同时从表中读取。

如果使用了表锁,它将导致对该表的所有查询都等到删除完成为止,而使用行锁只能选择读取特定的行来等待。

在任何情况下,删除前N个(其中N是许多行)很可能会锁定该表。