SELECT
zoekopdrachten met NOLOCK
nemen eigenlijk geen sloten, ze hebben nog steeds een SCH-S
. nodig (schemastabiliteit) slot op de tafel (en aangezien het een hoop er is ook een hobt
voor nodig slot
).
Bovendien vóór de SELECT
kan zelfs beginnen SQL Server moet een plan opstellen voor de instructie, waarvoor ook een SCH-S
nodig is buitensluiten op de tafel.
Aangezien uw langlopende transactie de tabel aanmaakt via SELECT ... INTO
het bevat een incompatibele SCH-M
vergrendel het totdat de verklaring is voltooid.
U kunt dit verifiëren door te kijken in sys.dm_os_waiting_tasks
terwijl terwijl tijdens de blokkeringsperiode.
Toen ik het volgende in één verbinding probeerde
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
En dan uitvoeren (of gewoon proberen om het geschatte uitvoeringsplan te bekijken)
SELECT *
FROM NewT
WITH (NOLOCK)
in een seconde werd de leesopdracht geblokkeerd.
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
Geeft aan dat het wachttype inderdaad SCH_S
. is en de blokkeerbron 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