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

SQL Server, den vildledende XLOCK &optimeringer

Eksklusivitet af X låse vs U låse

I låsekompatibilitetsmatrixen nedenfor kan det ses, at X lås er kun kompatibel med skemastabilitet og Insert Range-Null-låstyper. U er kompatibel med følgende yderligere delte låsetyper S /IS /RS-S /RI-S /RX-S

låsekompatibilitetsmatrix http://i.msdn.microsoft.com/ms186396.LockConflictTable(en-us,SQL.105).gif

Granularitet af X låse

Disse udtages fint på alle niveauer. Scriptet og profileringssporingen nedenfor viser, at de er blevet taget ud på rækkeniveau.

CREATE TABLE test_table (id int identity(1,1) primary key, col char(40))

INSERT INTO test_table
SELECT NEWID() FROM sys.objects

select * from test_table with (rowlock,XLOCK) where id=10

Men rækker kan stadig læses!

Det viser sig, at ved read committed isolationsniveau SQL Server vil ikke altid tage S ud låse, vil den springe dette trin over, hvis der ikke er nogen risiko for at læse uforpligtende data uden dem. Det betyder, at der ikke er nogen garanti for, at en låsekonflikt nogensinde opstår.

Men hvis det første valg er with (paglock,XLOCK)vil dette stop læsetransaktionen som X lås på siden vil blokere IS sidelås, som læseren altid har brug for. Dette vil naturligvis have indflydelse på samtidighed.

Andre forbehold

Selvom du låser rækken/siden, betyder dette ikke, at du blokerer alle adgange til den pågældende række i tabellen. En lås på en række i det klyngede indeks forhindrer ikke forespørgsler i at læse data fra den tilsvarende række i et dækkende ikke-klynget indeks.



  1. Kombiner flere resultater i en underforespørgsel til en enkelt kommasepareret værdi

  2. Sådan konverteres SQL Servers tidsstempelkolonne til datetime-format

  3. Del store sletningsoperationer op i bidder

  4. MySQL fejl 1064 syntaks, men alt virker fint