SELECT
consultas com NOLOCK
na verdade não aceitam cadeados, eles ainda precisam de um SCH-S
(estabilidade de esquema) trava na mesa (e como é um heap também levará um hobt
bloqueio
). Além disso, antes do
SELECT
pode até começar o SQL Server deve compilar um plano para a instrução, que também exige que ele tome um SCH-S
trancar na mesa. Como sua transação de longa duração cria a tabela via
SELECT ... INTO
ele contém um SCH-M
incompatível bloqueie-o até que a instrução seja concluída. Você pode verificar isso olhando em
sys.dm_os_waiting_tasks
Quando tentei o seguinte em uma conexão
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
E então executando (ou simplesmente tentando visualizar o plano de execução estimado)
SELECT *
FROM NewT
WITH (NOLOCK)
em um segundo a consulta de leitura foi bloqueada.
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
Mostra que o tipo de espera é realmente
SCH_S
e o recurso de bloqueio SCH-M
wait_type resource_description
---------------- -------------------------------------------------------------------------------------------------------------------------------
LCK_M_SCH_S objectlock lockPartition=0 objid=461960722 subresource=FULL dbid=1 id=lock4a8a540 mode=Sch-M associatedObjectId=461960722