Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

AGGIORNAMENTO + CON (ROWLOCK) + CTE

NOLOCK non si applica alla parte della query che fa riferimento alla tabella da modificare. Nelle istruzioni di aggiornamento di SQL Server U-lock ogni riga brevemente durante il test. Questo è un meccanismo per evitare lo stallo. Impedisce aggiornamenti multipli a ogni S-lock di una riga per la lettura e quindi prova a X-lock.

Non puoi far sparire le serrature a U AFAIK. Ma puoi ridurre la quantità di righe bloccate a U al minimo assoluto unendoti automaticamente:

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

Questo aggiunge un po' di sovraccarico ma ti permette di usare NOLOCK per la lettura.

Prendi in considerazione l'utilizzo dell'isolamento dello snapshot per le letture. NOLOCK presenta alcuni problemi come l'interruzione casuale delle query.