sql >> Databasteknik >  >> RDS >> Sqlserver

Dödläge på SELECT/UPDATE

Det räcker inte med att ha en serialiserbar transaktion, du måste tipsa om låsningen för att detta ska fungera.

Den serialiserbara isoleringsnivån kommer fortfarande vanligtvis att få den "svagaste" typen av lås den kan, vilket säkerställer att de serialiserbara villkoren är uppfyllda (upprepningsbara läsningar, inga fantomrader etc)

Så du tar tag i ett delat lås på ditt bord som du senare (i din serialiserbara transaktion) försöker uppgradera till ett uppdateringslås. Uppgraderingen kommer att misslyckas om en annan tråd håller det delade låset (det fungerar om ingen annan har ett delat lås).

Du vill förmodligen ändra det till följande:

SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId

Det kommer att säkerställa att ett uppdateringslås förvärvas när SELECT utförs (så att du inte behöver uppgradera låset).




  1. Fäst partitionslistan till befintlig tabell i postgres 11

  2. Är det en dålig idé att använda Dev/Test RDS för ditt projekt framför Production RDS?

  3. Konvertera PHP-datumintervall till MYSQL individuella datum

  4. Hur kan jag migrera versioner från bugzilla till ett nytt anpassat "källversionsfält" i redmine (vilken SQL-syntax behöver jag)?