sql >> Databasteknik >  >> RDS >> Sqlserver

Förvirrad om UPDLOCK, HOLDLOCK

Varför skulle UPDLOCK block väljar? Låskompatibilitetsmatrisen visar tydligt N för S/U- och U/S-påståendet, som i Ingen konflikt .

När det gäller HOLDLOCK-tipset står det i dokumentationen:

HOLDLOCK:Motsvarar SERIALISERBAR. För mer information, se SERIALISERABAR senare i detta ämne.

...

SERIALIZABLE:... Genomsökningen utförs med samma semantik som en transaktion som körs på SERIALIZABLE-isoleringsnivån...

och ämnet Transaktionsisoleringsnivå förklarar vad SERIALIZABLE betyder:

Inga andra transaktioner kan ändra data som har lästs av den aktuella transaktionen förrän den aktuella transaktionen är klar.

Andra transaktioner kan inte infoga nya rader med nyckelvärden som skulle falla inom intervallet för nycklar som läses av några uttalanden i den aktuella transaktionen förrän den aktuella transaktionen är klar.

Därför förklaras beteendet du ser perfekt av produktdokumentationen:

  • UPDLOCK blockerar inte samtidig SELECT eller INSERT, men blockerar alla UPPDATERINGAR eller DELETE av raderna som valts av T1
  • HOLDLOCK betyder SERALIZABLE och tillåter därför SELECTS, men blockerar UPDATE och DELETES av raderna som valts av T1, också som valfri INSERT i intervallet som valts av T1 (vilket är hela tabellen, därför alla infoga).
  • (UPDLOCK, HOLDLOCK):ditt experiment visar inte vad som skulle blockera utöver fallet ovan, nämligen en annan transaktion med UPDLOCK i T2 :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX behöver inga förklaringar

Den verkliga frågan är vad försöker du uppnå ? Att leka med låstips utan en absolut fullständig förståelse till 110 % av låssemantiken är att tigga om problem...

Efter OP-redigering:

Jag skulle vilja välja rader från en tabell och förhindra att data i den tabellen ändras medan jag bearbetar den.

Du bör använda en av de högre transaktionsisoleringsnivåerna. REPEATBAR LÄS kommer att förhindra att data du läser ändras. SERIALIZABLE kommer att förhindra att data du läser ändras och ny data från att infogas. Att använda transaktionsisoleringsnivåer är det rätta tillvägagångssättet, i motsats till att använda frågetips. Kendra Little har en fin affisch som förklarar isoleringsnivåerna.



  1. Varför är logiska läsningar för aggregerade fönsterfunktioner så höga?

  2. Postgresql COPY-kommandot som ger Behörighet nekad fel

  3. Hur kan jag korrekt använda ett PDO-objekt för en parameteriserad SELECT-fråga

  4. Hur man importerar och exporterar en MySQL-databas