Симптоми
Обмислете следния сценарий:
-
Вмъквате много редове в таблица в Microsoft SQL Server 2008 или в SQL Server 2008 R2 с помощта на една от следните заявки:
-
INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
-
SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
Бележки
-
<target_table> контейнер представлява действителната целева таблица име.
-
Контейнерът за <> представлява действителната предпоставка.
-
Контейнерът за <source_table> представлява действителната таблица източник.
-
-
Надхвърлен е прагът за ескалация на заключване на таблицата.
В този случай ядрото на базата данни не ескалира ключалките на таблицата.
Причина
Този проблем възниква, защото SQL Server не отчита вътрешно всички нови заключвания, генерирани от операциите за вмъкване. Следователно прагът за ескалация на заключване може да не се задейства, когато е необходимо.
Решение
Информация за сервизния пакет за SQL Server 2008
За да отстраните този проблем, получете най-новата услуга за SQL Server 2008. за повече информация щракнете върху следния номер на статия, за да видите статията в базата знания на Microsoft:
968382 Как да получите най-новия сервизен пакет за SQL Server 2008
Информация за сервизния пакет за SQL Server 2008 R2
За да отстраните този проблем, получете най-новата сервизна опаковка за SQL Server 2008 R2. За повече информация щракнете върху следния номер на статия, за да видите статията в базата знания на Microsoft:
2527041Как да получите най-новия сервизен пакет за SQL Server 2008 R2
Състоянието
Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са посочени в секцията "важи за".Този проблем е коригиран първо в SQL Server 2008 Service Pack 2 за SQL Server 2008. този проблем е коригиран първо в SQL Server 2008 R2 Service Pack 1 за SQL Server 2008 R2.
Повече информация
За повече информация за заключване на ескалация посетете следния уеб сайт на Microsoft TechNet:
Обща информация за ескалацията на заключванеЗа да определите дали ключалките на една таблица са ескалирани, изпълнете следните отчети за преговаряне:
USE tempdbGOCREATE TABLE x (i INT NOT NULL PRIMARY KEY)GOBEGIN TRANINSERT xSELECT TOP (40000)ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rFROM master..spt_values a, master..spt_values bORDER BYrSELECTCOUNT(*)FROM sys.dm_tran_locksWHERE request_session_id = @@SPID ROLLBACKGODROP TABLE x
Ако ключалките на таблицата са ескалирани, последната команда за ИЗБИРАНЕ връща стойност от 1 или 2. Ако ключалките на таблицата не се покачват, последното командата SELECT връща стойност от 40 066 или 40 067.