sql >> Databasteknik >  >> RDS >> Sqlserver

BESTÄLL EFTER och MED(ROWLOCK, UPDLOCK, READPAST)

Som förväntat

  • SELECT med ORDER BY, utan ROWLOCK, utan index kommer att ha ett tabelllås på grund av en skanning/mellansortering för att räkna ut TOP 2. Så den andra sessionen hoppar över hela tabellen på grund av READPAST

  • SELECT utan ORDER BY plockar bara vilka 2 rader som helst, som råkar vara i infogningsordning (ren tillfällighet, det finns ingen underförstådd ordning). Det faktum att dessa två rader är låsta gör att den andra sessionen hoppar till nästa olåsta rader.

SQL Server försöker hålla låsen så detaljerade som möjligt men skanningen innebär ett tabelllås. Nu skulle detta normalt inte göra någon skillnad (det skulle vara ett delat läslås) men du har också UPDLOCK vilket innebär ett exklusivt låst bord

Så du behöver båda dessa

  • 3 tips i SELECT-frågorna (ROWLOCK, UPDLOCK, READPAST) för att kontrollera granularitet, isolering och samtidighet.
    Att endast använda ROWLOCK kommer fortfarande att orsaka ett exklusivt lås på varje rad att skanna/sortera.
  • ett index på Value INKLUDERA TestID för att göra SELECT effektiv. Enbart ett index kommer förmodligen att fixa samtidigheten men det kommer inte att garanteras.

I en av dina tidigare frågor länkade jag till mitt svar (i en kommentar) till SQL Server Process Queue Race Condition där jag har alla 3 låstips




  1. Vad kan Query Plan berätta?

  2. LPAD i SQL Server 2008

  3. Deltar du i PASS Summit i Charlotte?

  4. I klausul för en lista med villkorspar