Проблемы
Рассмотрим следующий сценарий.
-
Вставка большого количества строк в таблицу в 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> — фактическое имя целевой таблицы.
-
Заполнитель <predicate> представляет фактический предикат.
-
<source_table> — фактическая исходная таблица.
-
-
Превышено пороговое значение эскалации блокировки для таблицы.
В этом сценарии ядро СУБД не эскалируется к блокировкам таблицы.
Причина
Эта проблема возникает из-за того, что SQL Server не будет внутренне подсчитать все новые блокировки, созданные с помощью операций вставки. Таким образом, порог эскалации блокировки может не сработать, если это необходимо.
Решение
Сведения о пакете обновления для SQL Server 2008
Чтобы устранить эту проблему, установите последнюю версию пакета обновления для SQL Server 2008. чтобы получить дополнительные сведения, щелкните следующий номер статьи базы знаний Майкрософт:
968382 Как получить последний пакет обновления для SQL Server 2008
Сведения о пакете обновления для SQL Server 2008 R2
Чтобы устранить эту проблему, установите последнюю версию пакета обновления для SQL Server 2008 R2. Чтобы получить дополнительные сведения, щелкните следующий номер статьи базы знаний Майкрософт:
2527041Как получить последний пакет обновления для SQL Server 2008 R2
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".Эта проблема впервые была исправлена в SQL Server 2008 с пакетом обновления 2 (SP2) для SQL Server 2008. Эта проблема впервые исправлена в SQL Server 2008 R2 с пакетом обновления 1 (SP1) для 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.