NOLOCK
gælder ikke for den del af forespørgslen, der refererer til den tabel, der skal ændres. I SQL Server-opdateringssætninger U-lås hver række kort, mens den testes. Dette er en mekanisme til at undgå dødvande. Det forhindrer flere opdateringer af hver S-lås en række til læsning og prøv derefter at X-låse den.
Du kan ikke få U-låsene til at gå væk AFAIK. Men du kan reducere antallet af rækker U-låst til det absolutte minimum ved selv at deltage:
update t1
set ...
from T t1 with (rowlock)
where t1.ID in (select TOP 5 ID from T t2 with (nolock) where ... order by ...)
Dette tilføjer lidt overhead, men det giver dig mulighed for at bruge NOLOCK
til læsning.
Overvej at bruge snapshot-isolering til læsningerne. NOLOCK
har visse problemer, såsom forespørgsler, der afbrydes tilfældigt.