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.