sql >> Base de Datos >  >> RDS >> Sqlserver

ACTUALIZAR + CON (ROWLOCK) + CTE

NOLOCK no se aplica a la parte de la consulta que hace referencia a la tabla que se va a modificar. En las declaraciones de actualización de SQL Server, bloquee cada fila brevemente mientras se prueba. Este es un mecanismo para evitar interbloqueos. Evita múltiples actualizaciones para cada S-bloquea una fila para leer y luego intenta X-bloquearla.

No puedes hacer que los candados en U desaparezcan AFAIK. Pero puede reducir la cantidad de filas bloqueadas en U al mínimo absoluto uniéndose a sí mismo:

update t1
set ...
from T t1 with (rowlock)
where t1.ID in (select TOP 5 ID from T t2 with (nolock) where ... order by ...)

Esto agrega un poco de sobrecarga pero le permite usar NOLOCK para leer.

Considere usar el aislamiento de instantáneas para las lecturas. NOLOCK tiene ciertos problemas, como consultas que se abortan aleatoriamente.