Exclusividade de X
bloqueios vs U
fechaduras
Na matriz de compatibilidade de bloqueio abaixo, pode-se ver que o
X
lock só é compatível com os tipos de bloqueio de estabilidade de esquema e Insert Range-Null. U
é compatível com os seguintes tipos de bloqueio compartilhados adicionais S
/IS
/RS-S
/RI-S
/RX-S
matriz de compatibilidade de bloqueio http://i.msdn.microsoft.com/ms186396.LockConflictTable(pt-br,SQL.105).gif
Granularidade de X
fechaduras
Estes são retirados bem em todos os níveis. O rastreamento do script e do criador de perfil abaixo demonstra que eles foram removidos com êxito no nível da linha.
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
Mas as linhas ainda podem ser lidas!
Acontece que em
read committed
nível de isolamento O SQL Server nem sempre removerá S
locks, ele pulará esta etapa se não houver risco de ler dados não confirmados sem eles. Isso significa que não há garantia de que um conflito de bloqueio ocorra. No entanto, se a seleção inicial for
with (paglock,XLOCK)
então isso vai pare a transação de leitura como o X
lock na página irá bloquear o IS
bloqueio de página que sempre será necessário para o leitor. Isso, obviamente, terá um impacto na simultaneidade. Outras advertências
Mesmo que você bloqueie a linha/página, isso não significa que você bloqueie todos os acessos a essa linha na tabela. Um bloqueio em uma linha no índice clusterizado não impedirá que as consultas leiam dados da linha correspondente em um índice não clusterizado de cobertura.