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)
så 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.