我们在客户站点上遇到锁堆积问题。通过组合使用工具,我们设法找到了根锁。它肯定在锁堆积时运行这个特定的 SQL 语句:
INSERT INTO #Gather
SELECT (columns omitted for brevity)
FROM dbo.vScheduleInsuranceRuleViolations WITH(rowlock) OPTION (MAXDOP 1)
锁层次结构分析得出一个不可避免的结论:WITH (rowlock)
在这里没有做任何有用的事情。
视图很长,正确地需要很长时间来评估。有几个调用者的不同之处仅在于过滤 WHERE 子句(大部分数据库或一些记录)和锁定/并发需求。在这个特定的调用者中,我们有最差的过滤器和最低的锁定需求(WITH (rowlock)
within READ COMMITTED
--READ UNCOMMITTED
在这里不起作用)。
在我将视图定义复制并粘贴到调用方之前,我想知道为什么这在可能的情况下不起作用;因为我希望WITH (rowlock)
适用于视图中读取的每个表。
初始点
提示的有趣之处
rowlock
在于存储引擎可以随意忽略它们。来自丢失共享锁的案例: