Jeg kan ikke se noget eksplicit transaktionsomfang i din kode, så jeg ved ikke, hvilke låse der allerede er på plads, når du laver din opdatering; Det er heller ikke klart, hvilket isolationsniveau du bruger. Men det mest almindelige scenarie i denne type situation er, at du tidligere i samme transaktion har udstedt en select (læselås) på de samme rækker, som du forsøger at opdatere senere. Dette vil forårsage en låseeskalering og kan resultere i et dødvande, hvis to transaktioner forsøger at gøre det samme:
- Transaktion A:vælg med læselås
- Transaktion B:vælg med læselås
- Transaktion A:opdatering - ønsker at eskalere sin læselås for at skrive lås, men må vente på, at transaktion B frigiver sin læselås
- Transaktion B:opdatering - ønsker at eskalere sin læselås for at skrive lås, men skal vente på, at transaktion A frigiver sin læselås.
Bingo! dødvande, da både A og B venter på hinanden for at frigive deres eksisterende læselåse, før de kan opdatere.
For at forhindre dette har du brug for et updlock-tip i dit valg, f.eks.
select * from table with (updlock) where blah blah
Dette sikrer, at dit udvalg bruger en skrivelås i stedet for en læselås, som forhindrer låseeskalering mellem samtidige transaktioner.