sql >> Database >  >> RDS >> Sqlserver

Wat blokkeert Selecteer top 1 * van TableName met (nolock) om een ​​resultaat te retourneren?

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


  1. Hoe doe je een tweede PDO mysql-query in een while-lus van een andere query?

  2. Diepe JSON-query met gedeeltelijk pad in MySQL 5.7?

  3. Een CHECK-beperking inschakelen in SQL Server (T-SQL-voorbeeld)

  4. SQLite-subquery