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

Forvirret over UPDLOCK, HOLDLOCK

Hvorfor skulle UPDLOCK blokere valg? Lock Compatibility Matrix viser tydeligt N for S/U- og U/S-påstanden, som i Ingen konflikt .

Hvad angår HOLDLOCK-hintet, står der i dokumentationen:

HOLDLOCK:Svarer til SERIALISERbar. For mere information, se SERIALIZABLEsenere i dette emne.

...

SERIALIZABLE:... Scanningen udføres med samme semantik som en transaktion, der kører på SERIALIZABLE isolationsniveauet...

og emnet Transaktionsisolationsniveau forklarer, hvad SERIALIZABLE betyder:

Ingen andre transaktioner kan ændre data, der er blevet læst af den aktuelle transaktion, før den aktuelle transaktion er fuldført.

Andre transaktioner kan ikke indsætte nye rækker med nøgleværdier, der falder inden for rækkevidden af ​​nøgler, der læses af nogen udsagn i den aktuelle transaktion, før den aktuelle transaktion er fuldført.

Derfor er den adfærd, du ser, perfekt forklaret af produktdokumentationen:

  • UPDLOCK blokerer ikke samtidig SELECT eller INSERT, men blokerer enhver OPDATERING eller DELETE af rækkerne valgt af T1
  • HOLDLOCK betyder SERALIZABLE og tillader derfor SELECTS, men blokerer UPDATE og DELETES af rækkerne valgt af T1, også som enhver INSERT i området valgt af T1 (som er hele tabellen, derfor enhver indsæt).
  • (UPDLOCK, HOLDLOCK):Dit eksperiment viser ikke, hvad der ville blokere ud over sagen ovenfor, nemlig en anden transaktion med UPDLOCK i T2 :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX behøver ikke forklaringer

Det egentlige spørgsmål er hvad forsøger du at opnå ? At lege med låsetip uden en absolut fuldstændig 110 % forståelse af låsesemantikken er tigger om problemer...

Efter OP-redigering:

Jeg vil gerne vælge rækker fra en tabel og forhindre, at dataene i den tabel bliver ændret, mens jeg behandler den.

Du bør bruge et af de højere transaktionsisolationsniveauer. REPEATABLE READ forhindrer, at de data, du læser, bliver ændret. SERIALIZABLE forhindrer de data, du læser, i at blive ændret og nye data fra at blive indsat. Brug af transaktionsisoleringsniveauer er den rigtige tilgang i modsætning til at bruge forespørgselstip. Kendra Little har en flot plakat, der forklarer isolationsniveauerne.



  1. Skift sproget for den aktuelle session i SQL Server

  2. APPLSYSPUB-skema

  3. Guide til designdatabase til opgavehåndtering i MySQL

  4. Trigger i SQL