Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

ATUALIZAÇÃO + COM (ROWLOCK) + CTE


NOLOCK não se aplica à parte da consulta que faz referência à tabela a ser modificada. Nas instruções de atualização do SQL Server, bloqueie cada linha brevemente enquanto ela está sendo testada. Este é um mecanismo de prevenção de deadlock. Ele impede várias atualizações para cada S-lock de uma linha para leitura e, em seguida, tenta X-lock.

Você não pode fazer os U-locks desaparecerem AFAIK. Mas você pode reduzir a quantidade de linhas bloqueadas em U para o mínimo absoluto por auto-junção:
update t1
set ...
from T t1 with (rowlock)
where t1.ID in (select TOP 5 ID from T t2 with (nolock) where ... order by ...)

Isso adiciona um pouco de sobrecarga, mas permite que você use NOLOCK para ler.

Considere usar o isolamento de instantâneo para as leituras. NOLOCK tem certos problemas, como consultas abortando aleatoriamente.