例)
我应该何时使用此声明:
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)是一个提示,指示数据库应该在行范围内保持锁定.这意味着数据库将避免将锁升级到块或表范围.
当查询仅影响单个行或仅几行时,可以使用提示,以防止锁定不会被查询删除的行.这将让另一个查询同时读取不相关的行,而不必等待删除完成.
如果在将删除大量行的查询上使用它,则可能会降低性能,因为数据库将尽量避免将锁升级到更大的范围,即使它更有效.
通常,您不需要向查询添加此类提示,因为数据库知道要使用哪种锁.仅在出现性能问题的情况下,因为数据库做出了错误的决定,您应该向查询添加此类提示.
行锁是一个查询提示,应谨慎使用(所有查询提示也是如此)。
省略它可能仍然会导致完全相同的行为,并且提供它不能保证仅使用行锁,毕竟这只是一个提示。如果您对锁争用没有很深入的了解,那么优化程序将选择最佳的锁策略,而这些事情通常最好由数据库引擎决定。
ROWLOCK表示执行删除操作时,SQL仅锁定受影响的行,而不锁定整个表或表中存储数据的页面。这只会影响其他人在删除操作运行的同时从表中读取。
如果使用了表锁,它将导致对该表的所有查询都等到删除完成为止,而使用行锁只能选择读取特定的行来等待。
在任何情况下,删除前N个(其中N是许多行)很可能会锁定该表。
| 归档时间: |
|
| 查看次数: |
49026 次 |
| 最近记录: |