SELECT
zapytania z NOLOCK
tak naprawdę nie przyjmują żadnych zamków, nadal potrzebują SCH-S
(stabilność schematu) blokada stołu (i jak to jest sterta zajmie również hobt
blokada
).
Dodatkowo przed SELECT
może nawet zacząć SQL Server musi skompilować plan dla instrukcji, co również wymaga przyjęcia SCH-S
zablokować na stole.
Ponieważ twoja długo trwająca transakcja tworzy tabelę za pomocą SELECT ... INTO
zawiera niezgodny SCH-M
zablokuj go, dopóki oświadczenie się nie zakończy.
Możesz to sprawdzić, zaglądając do sys.dm_os_waiting_tasks
podczas podczas w okresie blokowania.
Kiedy próbowałem następujących w jednym połączeniu
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
A potem wykonanie (lub po prostu próba wyświetlenia szacunkowego planu wykonania)
SELECT *
FROM NewT
WITH (NOLOCK)
w ciągu sekundy zapytanie odczytu zostało zablokowane.
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
Pokazuje, że typ oczekiwania to rzeczywiście SCH_S
i blokujący zasób 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