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

TABLOCK vs TABLOCKX

Stor forskel, TABLOCK vil prøve at få fat i "delte" låse og TABLOCKX eksklusive låse.

Hvis du er i en transaktion, og du snupper en eksklusiv lås på et bord, f.eks.:

SELECT 1 FROM TABLE WITH (TABLOCKX)

Ingen andre processer vil være i stand til at fange nogen låse på bordet, hvilket betyder alle forespørgsler, der forsøger at tale til bordet, vil blive blokeret, indtil transaktionen forpligtes.

TABLOCK griber kun en delt lås, delte låse frigives efter en erklæring er udført, hvis din transaktionsisolering er READ COMMITTED (Standard). Hvis dit isolationsniveau er højere, for eksempel:SERIALIZABLE , delte låse holdes indtil slutningen af ​​en transaktion.

Delte låse er, hmmm, delte. Det betyder, at 2 transaktioner begge kan læse data fra tabellen på samme tid, hvis de begge har en S- eller IS-lås på bordet (via TABLOCK ). Men hvis transaction A har en delt lås på et bord, transaction B vil ikke være i stand til at få fat i en eksklusiv lås, før alle delte låse er frigivet. Læs om hvilke låse der er kompatible med hvilke på msdn.

Begge tip får db til at omgå at tage mere granulære låse (som række- eller sideniveaulåse). I princippet giver mere granulerede låse dig bedre samtidighed. Så for eksempel kan én transaktion være at opdatere række 100 i din tabel og en anden række 1000, på samme tid fra to transaktioner (det bliver vanskeligt med sidelåse, men lad os springe det over).

Generelt er granulære låse, hvad du ønsker, men nogle gange vil du måske reducere db samtidighed for at øge ydeevnen af ​​en bestemt operation og eliminere chancen for deadlocks.

Generelt ville du ikke bruge TABLOCK eller TABLOCKX medmindre du absolut havde brug for det til en kantkasse.



  1. Ydeevne overraskelser og antagelser:DATEADD

  2. Er det muligt at køre et SQLPLUS script på en fil kodet som UTF-8 med BOM

  3. Hold orden fra 'IN'-klausulen

  4. SQL Server 2016:sys.dm_exec_function_stats