Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

UPDATE + MIT (ROWLOCK) + CTE

NOLOCK gilt nicht für den Teil der Abfrage, der auf die zu ändernde Tabelle verweist. In SQL Server-Update-Anweisungen wird jede Zeile während des Testens kurz mit U-Sperre versehen. Dies ist ein Deadlock-Vermeidungsmechanismus. Es verhindert mehrere Aktualisierungen für jede S-Sperre eine Zeile zum Lesen und versucht dann, sie mit X-Sperre zu versehen.

Sie können die U-Schlösser AFAIK nicht verschwinden lassen. Aber Sie können die Anzahl der Zeilen, die U-locked sind, auf das absolute Minimum reduzieren, indem Sie sich selbst verbinden:

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

Dies fügt ein wenig Overhead hinzu, erlaubt Ihnen aber, NOLOCK zu verwenden zum Lesen.

Erwägen Sie die Snapshot-Isolation für die Lesevorgänge. NOLOCK hat bestimmte Probleme wie z. B. willkürlich abgebrochene Abfragen.