Я запускал процедуру внутри курсора. После многих успешных итераций я получил это: Transaction (Process ID 104) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Я не публикую полную информацию, поэтому я не ожидаю подробного ответа по отладке. Факты:
- Я уверен, что никто другой (включая меня в другом сеансе) не использовал процесс, так как я его разрабатывал и
- Эта транзакция застряла при выполнении
select
(я видел текущий запрос из запросов dm exec)
Если я не ошибаюсь по моим 2 пунктам, возможен ли когда-нибудь тупик? Разве взаимоблокировка не потребует, чтобы все вовлеченные пользователи ресурса выполняли операции записи на них, что создало бы цикл в графе запросов ресурсов? Я понимаю ошибку тайм-аута в select
, но не могу понять взаимоблокировку. Что мне не хватает?
Обновление:
Я отказался от дальнейшей отладки, потому что заметил, что индекс, который, как я думал, существовал, не существует. Когда он был создан, производительность была в порядке.
Однако в надежде сохранить это полезным и, надеюсь, найти ответ, вот еще несколько вещей, которые я исследовал, некоторые факты и мысли о комментариях:
Во первых версия sql server 2008. Я так понимаю не поддерживается. Я не в состоянии давать рекомендации, тем более обновлять сервер.
Я нашел комментарий Jeroen Mostert интересным. Сколько стоит прошлое? Я заметил в sys.dm_os_waiting_tasks, что сеанс блокируется сам по себе несколько раз с типом ожидания CXPACKET. Я немного поискал, но опция (maxdop 1) не решила проблему. Однако помните об несуществующем индексе, который привел бы к ужасной производительности. Может быть, правильный параллелизм добавлен, но операций слишком много? Тем не менее, я также стал свидетелем огромного dm_exec_requests.wait_time. Таким образом, даже несмотря на то, что запрос был плохим, я пришел к выводу, что вокруг были странные (мертвые) блокировки.
Если в ответе/комментарии появятся конкретные запросы/шаги для отслеживания проблемы, я буду рад воссоздать ее.
SELECT
по-прежнему требует блокировки таблицы, а таблица не должна быть заблокирована, чтобы она возвращала правильные данные на уровень приложения/представления. Когда вы игнорируете блокировки (и делаете глупости, например, спамите подсказкуNOLOCK
), вы начинаете получать всевозможные ошибочные данные. - person Larnu   schedule 29.09.2020select
. Вот что меня интересует. - person George Menoutis   schedule 29.09.2020SELECT
не может совместно использовать блокировку с оператором DML. - person Larnu   schedule 29.09.2020