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.