У меня возникла проблема в 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 не возвращает ошибку и просто сидит там, я ничего не могу с этим поделать. Благодаря!
жертва должна быть выбрана, если это четкий тупик, однако, если мы имеем дело с ожиданиями ресурса (т. Е. Ожидание возврата индекса в онлайн после серьезного изменения), выбор будет сидеть и ждать. Я знаю, что некоторые считают это грязным словом, но разве NOLOCK не может быть здесь? Да, я знаю, что это может привести к чтению данных, которые могут быть устаревшими в момент их чтения (uncommitted inserts deletees & updates и т. Д.)? Если вы уверены, что это тупик, можете ли вы сообщить нам, какие типы ожиданий вы получаете? – HeavenCore
HeavenCore указывает на важное различие. «Тупик» будет * никогда * не заканчиваться, но ресурс ждёт * в конце концов? – mickeyf
На «некоторые из одних и тех же соединенных таблиц для выбора» - это место, где может возникнуть взаимоблокировка. Если они являются статическими или могут рассматриваться как статические в течение всего двух хранимых процедур, то присоединяться к этим таблицам с помощью (nolock). Для таблицы обновлений используйте rowlock. – Paparazzi