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

时间:2010-06-09 13:01:57

标签: sql sql-server

例)

我应该何时使用此声明:

DELETE TOP (@count)
FROM ProductInfo WITH (ROWLOCK)
WHERE ProductId = @productId_for_del;

什么时候该做:

DELETE TOP (@count)
FROM ProductInfo
WHERE ProductId = @productId_for_del;

2 个答案:

答案 0 :(得分:24)

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

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

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

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

答案 1 :(得分:5)

Rowlock是一个应该谨慎使用的查询提示(就像所有查询提示一样)。

省略它可能仍然会导致完全相同的行为,并且提供它并不能保证它只会使用行锁,它只是一个提示。如果你对锁争用没有非常深入的了解,那么优化器就会选择最好的锁定策略,这些东西通常最好留给数据库引擎来决定。

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

如果使用表锁,它将导致对表的所有查询等到删除完成后,只有行锁才会选择读取将要等待的特定行。

删除前N个,其中N是行数,很可能在任何情况下锁定表。