sql >> Databáze >  >> RDS >> Sqlserver

Co blokuje Vybrat 1 * z TableName s (nolock) před vrácením výsledku?

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


  1. Problém s připojovacím řetězcem ve webovém konfiguračním souboru

  2. Načíst výpis Postgres po vytvoření docker-compose up

  3. Zkontrolujte, zda byl záznam mySQL přidán za posledních x sekund

  4. Jak napsat hql dotaz pro mezi klauzuli pro časové období?