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 ServerSQL Server:

Рекомендація: інсталюйте останній сукупний пакет оновлень для SQL Server

Кожне нове сукупне оновлення для SQL Server містить усі виправлення та виправлення системи безпеки, які входили до попереднього сукупного пакета оновлень. Радимо завантажити та інсталювати останні сукупні оновлення для SQL Server.

      

Додаткові відомості

Коли DDL створює або видаляє таблицю чи індекс, йому потрібно вставити чи видалити ідентифікатор набору рядків таблиці чи індексу з sysrowsets, для чого він має утримувати блокування рядка рівня X на записі. Коли це робиться всередині транзакції, блокування X буде утримуватися протягом усього часу транзакції.

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

Sysrowsets впорядковано за ідентифікатором набору рядків, таким чином, може статися, що Tuple Mover просканував кілька існуючих наборів рядків, щодо яких він не має жодних дій, але все одно утримуватиме блокування SCH-S, і він приходить до запису в sysrowsets, для якого він не може отримати блокування рядка рівня S, оскільки він наразі змінюється довготривалою транзакцією, яка утримує блокування X на рядку. На цьому етапі DDL, що призводять до зміни ідентифікатора рядків, блокуються за блокуваннями SCH-S від Tuple Mover.

Стан

Корпорація Microsoft підтвердила, що це одна з проблем з продуктами Microsoft, перелічених у розділі "Застосовується до".

Посилання

Дізнайтеся, за допомогою яких термінів корпорація Майкрософт описує оновлення програмного забезпечення.