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