Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

MISE À JOUR + AVEC (ROWLOCK) + CTE

NOLOCK ne s'applique pas à la partie de la requête qui référence la table à modifier. Dans les instructions de mise à jour de SQL Server, verrouillez brièvement chaque ligne pendant qu'elle est testée. Il s'agit d'un mécanisme d'évitement de blocage. Il empêche plusieurs mises à jour de chaque S-lock d'une ligne pour la lecture, puis essaie de le verrouiller en X.

Vous ne pouvez pas faire disparaître les antivols en U AFAIK. Mais vous pouvez réduire le nombre de lignes verrouillées en U au minimum absolu en les rejoignant elles-mêmes :

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

Cela ajoute un peu de surcharge mais cela vous permet d'utiliser NOLOCK pour la lecture.

Envisagez d'utiliser l'isolement d'instantané pour les lectures. NOLOCK a certains problèmes tels que des requêtes abandonnées de manière aléatoire.