sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan slipper man af med dødvande i en SQL Server 2005 og C#-applikation?

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:

  1. Transaktion A:vælg med læselås
  2. Transaktion B:vælg med læselås
  3. 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
  4. 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.



  1. Hvilken type vil du kortlægge BigDecimal i Java/Hibernate i MySQL?

  2. Indsæt hex-værdier i MySql

  3. Hvordan ændrer man nummer(7,2) til varchar i oracle?

  4. psycopg2:indsæt flere rækker med én forespørgsel