sql >> Databasteknik >  >> RDS >> Sqlserver

Hur blir man av med dödläge i en SQL Server 2005 och C#-applikation?

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:

  1. Transaktion A:välj med läslås
  2. Transaktion B:välj med läslås
  3. 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
  4. 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.



  1. PHP Konvertera datum till tomma dagar/timmar/sekunder sedan

  2. Söka efter text inom Oracle Stored Procedures

  3. Vad är poängen med INTE NULL DEFAULT ''?

  4. Är det möjligt att använda GROUP BY med bindningsvariabler?