SELECT заявки с NOLOCK всъщност не приемат никакви ключалки, те все още се нуждаят от SCH-S (стабилност на схемата) заключване на масата (и тъй като е heap ще отнеме и hobt заключване
).
Освен това преди SELECT може дори да започне SQL Server трябва да компилира план за израза, което също изисква да вземе SCH-S заключете на масата.
Тъй като вашата дълготрайна транзакция създава таблицата чрез SELECT ... INTO той съдържа несъвместим SCH-M заключете го, докато изявлението завърши.
Можете да проверите това, като погледнете в sys.dm_os_waiting_tasks докато докато по време на периода на блокиране.
Когато опитах следното в една връзка
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
И след това изпълнение (или просто опит за преглед на прогнозния план за изпълнение)
SELECT *
FROM NewT
WITH (NOLOCK)
след секунда заявката за четене беше блокирана.
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
Показва, че типът на изчакване наистина е SCH_S и блокиращия ресурс 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