SELECT
dotazy pomocí NOLOCK
ve skutečnosti neberte žádné zámky, stále potřebují SCH-S
(stabilita schématu) zámek na stole (a protože je halda bude také trvat hobt
zámek
).
Navíc před SELECT
může dokonce začít SQL Server musí sestavit plán příkazu, který také vyžaduje, aby přijal SCH-S
zamknout na stole.
Jak vaše dlouho běžící transakce vytvoří tabulku pomocí SELECT ... INTO
obsahuje nekompatibilní SCH-M
uzamkněte jej, dokud se příkaz nedokončí.
Můžete si to ověřit v sys.dm_os_waiting_tasks
zatímco zatímco během období blokace.
Když jsem v jednom připojení zkoušel následující
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
A pak provedení (nebo se jednoduše pokuste zobrazit odhadovaný plán provádění)
SELECT *
FROM NewT
WITH (NOLOCK)
ve vteřině byl dotaz na čtení zablokován.
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
Ukazuje, že typ čekání je skutečně SCH_S
a blokující zdroj 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