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

BESTIL EFTER og MED (ROWLOCK, UPDLOCK, READPAST)

Som forventet

  • SELECT med ORDER BY, uden ROWLOCK, uden indeks vil have en tabellås på grund af en scanning/mellemsortering for at finde TOP 2. Så den 2. session springer hele tabellen over på grund af READPAST

  • SELECT uden ORDER BY vælger bare 2 rækker, som tilfældigvis er i rækkefølge efter indsættelse (ren tilfældighed, der er ingen underforstået rækkefølge). Det faktum, at disse 2 rækker er låst, får den 2. session til at springe til de næste ikke-låste rækker.

SQL Server forsøger at holde låse så granulære som muligt, men scanningen betyder en tabellås. Nu ville dette normalt ikke gøre en forskel (det ville være en delt læselås), men du har også UPDLOCK, hvilket betyder et udelukkende låst bord

Så du har brug for begge disse

  • 3 tip i SELECT-forespørgslerne (ROWLOCK, UPDLOCK, READPAST) for at kontrollere granularitet, isolation og samtidighed.
    Brug af kun ROWLOCK vil stadig få en eksklusiv lås på hver række til at scanne/sortere.
  • et indeks på Value INDLÆG TestID for at gøre SELECT effektiv. Kun et indeks vil sandsynligvis rette op på samtidigheden, men det vil ikke være garanteret.

I et af dine tidligere spørgsmål linkede jeg til mit svar (i en kommentar) til SQL Server Process Queue Race Condition hvor jeg har alle 3 låsetips




  1. nPLS-00306:forkert nummer eller typer af argumenter i opkald

  2. Brug af en variabel i OPENROWSET-forespørgsel

  3. OracleCommand SQL Parameter Binding

  4. Laravel SQLSTATE[22007]:Ugyldigt datetime-format:1292 Forkert datetime-værdi:'2019-03-10 02:00:39' for kolonnen 'updated_at' (sommertid?)