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

SQL Server, XLOCK e ottimizzazioni ingannevoli

Esclusività di X lock vs U serrature

Nella matrice di compatibilità della serratura sottostante si può vedere che la X lock è compatibile solo con i tipi di blocco di stabilità dello schema e Inserisci intervallo-Null. U è compatibile con i seguenti tipi di blocco condiviso aggiuntivi S /IS /RS-S /RI-S /RX-S

bloccare la matrice di compatibilità http://i.msdn.microsoft.com/ms186396.LockConflictTable(en-us,SQL.105).gif

Granularità di X serrature

Questi sono tirati fuori bene a tutti i livelli. La traccia dello script e del profiler di seguito mostra che sono stati eliminati correttamente a livello di riga.

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

Ma le righe possono ancora essere lette!

Si scopre che in read committed livello di isolamento SQL Server non eliminerà sempre S lock, salterà questo passaggio se non c'è il rischio di leggere i dati non vincolati senza di essi. Ciò significa che non vi è alcuna garanzia che si verifichi un conflitto di blocco.

Tuttavia, se la selezione iniziale è with (paglock,XLOCK) allora questo farà interrompere la transazione di lettura come X il blocco della pagina bloccherà il IS blocco della pagina che sarà sempre necessario al lettore. Ciò avrà ovviamente un impatto sulla concorrenza.

Altre avvertenze

Anche se blocchi la riga/pagina, ciò non significa che blocchi tutti gli accessi a quella riga nella tabella. Un blocco su una riga nell'indice cluster non impedirà alle query di leggere i dati dalla riga corrispondente in un indice non cluster di copertura.