2012-04-10 2 views
1

У меня возникла проблема в SQL Server 2005. Хранимая процедура запускается в приложении PowerBuilder, которое затем вызывает библиотеку DLL C#, которая выполняет другую хранимую процедуру.SQL Server попадает в тупик, не выбирает жертву

Первая процедура выполняет некоторые удаления в таблице на основе критериев, а вторая процедура использует эту таблицу в качестве основного источника данных для вставки в другую таблицу. Процедуры используют одни и те же объединенные таблицы для выбора, но только одна таблица изменяется.

Проблема в том, что эта настройка иногда является взаимоблокировками, но SQL Server ничего не делает. В библиотеке DLL есть заявления try/catch, которые регистрируют ошибку, если вызванная им процедура была убита из-за тупика, но вместо этого библиотека просто ждет ожидания завершения процедуры. Я позволил ему сидеть в течение 10 минут, и он все еще зашел в тупик.

Я попробовал использовать инструкцию DEADLOCK_PRIORITY LOW во второй процедуре, так как ей нужно дождаться окончания удаления до ее выбора. Я также попробовал разбор, чтобы выбрать оператор только для одной таблицы, чтобы проверить его, и он все равно попадает в тупик. Я также попытался использовать блок TRY/CATCH с BEGIN TRANSACTION, чтобы уловить блокировки в обеих процедурах, но это тоже не помогло.

Есть ли способ заставить SQL Server убить транзакцию, если она заблокирована? Я могу обрабатывать ошибки в DLL, но если SQL Server не возвращает ошибку и просто сидит там, я ничего не могу с этим поделать. Благодаря!

+0

жертва должна быть выбрана, если это четкий тупик, однако, если мы имеем дело с ожиданиями ресурса (т. Е. Ожидание возврата индекса в онлайн после серьезного изменения), выбор будет сидеть и ждать. Я знаю, что некоторые считают это грязным словом, но разве NOLOCK не может быть здесь? Да, я знаю, что это может привести к чтению данных, которые могут быть устаревшими в момент их чтения (uncommitted inserts deletees & updates и т. Д.)? Если вы уверены, что это тупик, можете ли вы сообщить нам, какие типы ожиданий вы получаете? – HeavenCore

+0

HeavenCore указывает на важное различие. «Тупик» будет * никогда * не заканчиваться, но ресурс ждёт * в конце концов? – mickeyf

+0

На «некоторые из одних и тех же соединенных таблиц для выбора» - это место, где может возникнуть взаимоблокировка. Если они являются статическими или могут рассматриваться как статические в течение всего двух хранимых процедур, то присоединяться к этим таблицам с помощью (nolock). Для таблицы обновлений используйте rowlock. – Paparazzi

ответ

2

Я хотел бы взглянуть на эту статью: http://www.sql-server-performance.com/2006/reducing-locks/

Это говорит о снижении блокировок SQL Server, которые могут быть частью вашего вопроса здесь. Я бы рекомендовал играть с настройками блокировки на таблице/странице (вкл/выкл страницы) и посмотреть, помогает ли это ситуации.

Вместо того, чтобы пытаться установить исправление, попробуйте устранить основную причину.

+0

Спасибо, я смог решить проблему после прохождения ссылки. Используя SET LOCK_TIMEOUT, убедитесь, что вторая процедура не застряла. Это главное, что меня беспокоило. Я смог решить основную проблему, удалив удаление из таблицы из второй процедуры. Кажется, теперь он работает нормально. – Greg