例)
我应该何时使用此声明:
DELETE TOP (@count)
FROM ProductInfo WITH (ROWLOCK)
WHERE ProductId = @productId_for_del;
什么时候该做:
DELETE TOP (@count)
FROM ProductInfo
WHERE ProductId = @productId_for_del;
答案 0 :(得分:24)
with (rowlock)
是一个提示,指示数据库应该在行范围内保持锁定。这意味着数据库将避免将锁升级到块或表范围。
当查询仅影响一行或仅几行时,您可以使用提示,以防止锁定锁定不会被查询删除的行。这将让另一个查询同时读取不相关的行,而不必等待删除完成。
如果在将删除大量行的查询上使用它,可能会降低性能,因为数据库会尽量避免将锁升级到更大的范围,即使它更有效。
通常,您不需要向查询添加此类提示,因为数据库知道要使用哪种锁。只有在出现性能问题的情况下,因为数据库做出了错误的决定,您应该将这些提示添加到查询中。
答案 1 :(得分:5)
Rowlock是一个应该谨慎使用的查询提示(就像所有查询提示一样)。
省略它可能仍然会导致完全相同的行为,并且提供它并不能保证它只会使用行锁,它只是一个提示。如果你对锁争用没有非常深入的了解,那么优化器就会选择最好的锁定策略,这些东西通常最好留给数据库引擎来决定。
ROWLOCK表示SQL只会锁定受影响的行,而不会锁定整个表或执行删除时存储数据的表中的页面。这只会影响在您的删除运行的同时从表中读取的其他人。
如果使用表锁,它将导致对表的所有查询等到删除完成后,只有行锁才会选择读取将要等待的特定行。
删除前N个,其中N是行数,很可能在任何情况下锁定表。