KB3168793 — ИСПРАВЛЕНИЕ. Не удается создать или удалить таблицу или индекс, если в той же базе данных выполняется другая транзакция DDL в SQL Server 2016 г.

Применяется к
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

Проблема

При выполнении операций DDL, таких как создание индекса или усечение таблицы в SQL Server 2016 г., операции могут быть заблокированы, если в той же базе данных выполняется другая транзакция DDL.

Решение

Эта проблема была исправлена в следующем накопительном обновлении SQL Server:

Рекомендация. Установите последнее накопительное обновление для SQL Server

Каждое новое накопительное обновление для SQL Server содержит все исправления и все исправления для системы безопасности, которые были включены в предыдущее накопительное обновление. Рекомендуется скачать и установить последние накопительные обновления для SQL Server:

      

Дополнительные сведения

Когда DDL создает или удаляет таблицу или индекс, ему необходимо вставить или удалить идентификатор набора строк таблицы или индекса из системных наборов, для которых необходимо сохранить блокировку на уровне строк X в записи. Когда это делается внутри транзакции, блокировка X будет храниться на протяжении всего срока транзакции.

Когда объект Tuple Mover обнаруживает буферы удаления с возможностью очистки, ему необходимо выполнить итерацию по системным наборам, чтобы обнаружить существующие таблицы или индексы. Чтобы считывать каждую строку из sysrowsets, ему необходимо установить блокировку S уровня строки для записи, которую он читает в данный момент. Процесс обнаружения останавливается, когда средство перемещения кортежей находит первый набор строк, над который он может работать. На этом этапе Tuple Mover выполнит фактическую работу по очистке буфера удаления, но чтобы убедиться, что обнаруженный набор строк по-прежнему действителен, он будет хранить блокировку SCH-S для всех наборов строк, которые он вычислял в процессе обнаружения, пока не завершит свою работу.

Наборы sysrowset упорядочены по идентификатору набора строк, поэтому может случиться, что Кортеж Mover сканировал несколько существующих наборов строк, для которых он не выполняет никаких действий, но по-прежнему будет содержать блокировку SCH-S и поступает в запись в системных наборах, для которой он не может получить блокировку S уровня строки, так как в настоящее время она изменяется длительной транзакцией, которая содержит блокировку X в строке. На этом этапе DDLs, включающие изменение идентификатора набора строк, блокируются за блокировками SCH-S Кортежа Mover.

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».

Ссылки

Узнайте о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.