Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server, o XLOCK enganoso e otimizações

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.