Jag kan inte se något explicit transaktionsomfång i din kod, så jag vet inte vilka lås som redan finns på plats när du gör din uppdatering; Det är inte heller klart vilken isoleringsnivå du använder. Men det vanligaste scenariot i den här typen av situationer är att du tidigare i samma transaktion har utfärdat ett urval (läslås) på samma rader som du försöker uppdatera senare. Detta kommer att orsaka en låseskalering och kan resultera i ett dödläge om två transaktioner försöker göra samma sak:
- Transaktion A:välj med läslås
- Transaktion B:välj med läslås
- Transaktion A:uppdatering - vill eskalera sitt läslås för att skriva lås, men måste vänta på att transaktion B släpper sitt läslås
- Transaktion B:uppdatering - vill eskalera sitt läslås för att skriva lås, men måste vänta på att transaktion A släpper sitt läslås.
Bingo! dödläge eftersom både A och B väntar på varandra för att släppa sina befintliga läslås innan de kan göra sin uppdatering.
För att förhindra detta behöver du ett upplåsningstips i ditt val, t.ex.
select * from table with (updlock) where blah blah
Detta säkerställer att ditt val använder ett skrivlås istället för ett läslås, vilket förhindrar låseskalering mellan samtidiga transaktioner.