Ознаки
Розглянемо такий сценарій:
-
Ви вставляєте багато рядків у таблицю в 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 Knowledge Base:
968382 Отримання найновішого пакета оновлень для SQL Server 2008
Відомості про пакет оновлень для SQL Server 2008 R2
Щоб вирішити цю проблему, отримайте найновіший пакет оновлень для SQL Server 2008 R2. Щоб отримати докладні відомості, клацніть цей номер статті, щоб переглянути статтю в базі знань Microsoft Knowledge Base:
2527041Отримання найновішого пакета оновлень для SQL Server 2008 R2
Стан
Корпорація Майкрософт підтвердила, що це проблема в продуктах Microsoft, перелічених у розділі "застосовується до".Цю проблему було спочатку виправлено в SQL Server 2008 Service Pack 2 для SQL Server 2008. цю проблему спочатку виправлено в SQL Server 2008 R2 Service Pack 1 для SQL Server 2008 R2.
Додаткові відомості
Щоб отримати докладні відомості про блокування ескалації, перейдіть на веб-сайт Microsoft TechNet:
Загальні відомості про блокування ескалаціїЩоб визначити, чи перезапущено замки таблиці, виконайте наведені нижче твердження Transact-SQL.
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
Якщо ви переросли замки таблиці, останній оператор SELECT повертає значення 1 або 2. Якщо не переросли замки таблиці, останній оператор SELECT повертає значення 40 066 або 40 067.