Недавно одно из наших приложений ASP.NET показало ошибку взаимоблокировки базы данных, и меня попросили проверить и исправить ошибку. Мне удалось найти причину тупика - хранимой процедуры, которая строго обновляла таблицу внутри курсора.
Я впервые вижу эту ошибку и не знаю, как ее эффективно отследить и исправить. Я перепробовал все возможные способы и, наконец, обнаружил, что обновляемая таблица не имеет первичного ключа! К счастью, это был столбец идентификации.
Позже я обнаружил, что разработчик, который написал сценарий для базы данных, запутался. Я добавил первичный ключ, и проблема была решена.
Я чувствовал себя счастливым и вернулся к своему проекту, и провел некоторое исследование, чтобы выяснить причину этого тупика ...
По-видимому, это было круглое условие ожидания, которое вызвало тупик. Обновления, по-видимому, занимают больше времени без первичного ключа, чем с первичным ключом.
Я знаю, что это не очень четкий вывод, поэтому я публикую здесь ...
- Проблема с отсутствующим первичным ключом?
- Существуют ли другие условия, которые вызывают взаимоблокировку, кроме (взаимное исключение, удержание и ожидание, отсутствие прерывания и циклическое ожидание)?
- Как мне предотвратить и отследить тупики?