Temos um problema de empilhamento de bloqueio em um site do cliente. Por uma combinação de ferramentas, conseguimos localizar o root locker. Definitivamente, está executando esta instrução SQL específica no momento do empilhamento de bloqueio:
INSERT INTO #Gather
SELECT (columns omitted for brevity)
FROM dbo.vScheduleInsuranceRuleViolations WITH(rowlock) OPTION (MAXDOP 1)
A análise da hierarquia de bloqueio leva a uma conclusão inevitável: WITH (rowlock)
não está fazendo nada de útil aqui.
A visão é muito longa e, com razão, leva muito tempo para ser avaliada. Existem vários chamadores que diferem apenas na cláusula WHERE de filtragem (a maior parte do banco de dados ou alguns registros) e na demanda de bloqueio/simultaneidade. Neste chamador específico, temos o pior filtro e a menor demanda de bloqueio ( WITH (rowlock)
dentro de READ COMMITTED
-- READ UNCOMMITTED
não funcionará aqui).
Antes de copiar e colar a definição de exibição no chamador, quero saber por que isso não funciona, se possível; porque espero que se WITH (rowlock)
aplique a todas as tabelas lidas na exibição.
ponto de partida
A coisa divertida sobre
rowlock
as dicas é que o mecanismo de armazenamento é livre para ignorá-las. Do caso dos bloqueios compartilhados ausentes :