Тупиковая блокировка усечения SQL Server 2000

В настоящее время мы работаем с базой данных на SQL Server 2000. База данных постоянно импортирует данные из плоских файлов для последующих запросов. Этот процесс выполняется серией хранимых процедур SQL Server и вызывает BCP из этих процедур через xp_cmdshell. Сценарии используют BCP для чтения плоских файлов в постоянные таблицы во вторичной базе данных на том же сервере. Затем сценарии извлекут данные из таблиц базы данных импорта и поместят их в реальную базу данных, которая нормализуется и используется для запросов.

Обычно этот процесс импорта занимает 5-10 минут в зависимости от размера файлов. Однако на прошлой неделе это длилось 50-60 минут. Мы попробовали пройти через процедуры. Мы заметили, что как только мы создаем временную таблицу, мы не можем запросить tempdb из другого окна запроса. Но что еще более важно, когда мы можем легко пройти до тех пор, пока мы не усечем первую таблицу импорта. Мы разрешаем выполнение усечения, а затем, когда мы проверяем блокировки в базе данных с помощью sp_lock, мы видим, что блокировки, принятые усечением, не снимаются. Затем мы разрешаем вызов xp_cmdshell к BCP, и он остается там. Мы смотрим на ЦП и ввод-вывод и не видим значительной активности, когда процедура зависает при вызове BCP. Также, когда мы пытаемся это сделать, другие известные запросы не выполняются. Обратите внимание, что сам файл небольшой; максимум 20 строк.

Если мы запустим команду bcp с xp_cmdshell из отдельного запроса, она будет работать нормально, но заблокируется, если мы выполнили строку усечения, но еще не выполнили строку BCP в хранимой процедуре.

Итак, у нас возникают вопросы: почему сервер попадает в это состояние тупика и, что менее важно, почему блокировки, сделанные с помощью truncate, не снимаются?


person devinh64    schedule 13.02.2013    source источник


Ответы (1)


Блокировки в SQL Server удерживаются только при наличии активной транзакции. Вы должны подтвердить транзакцию перед вызовом внешнего BCP. В противном случае вы попадете в этот тупик.

Кстати, этот тупик не может быть обнаружен SQL Server, поэтому, если это произойдет, вы застрянете в нем навсегда.

person Sebastian Meine    schedule 13.02.2013