Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Какво пречи Select top 1 * from TableName with (nolock) да връща резултат?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се справя с типа данни TIME от SQL Server 2008 с NHibernate?

  2. Динамично извличане на имена на параметри и текущи стойности в T-SQL съхранена процедура

  3. SQL Server 2000 - Свързан сървър

  4. Преобразувайте номера на месеца във функция за име на месеца в SQL

  5. Как да създадете дата в SQL Server, дадени ден, месец и година като цели числа