В последнее время мы сталкиваемся с ошибкой Transaction ABORTed due to Deadlock
, когда идем обновлять запись в одной из наших таблиц. Что-то блокирует этот стол, и он не выпускается, но я потратил буквально рабочие дни, пытаясь его отследить, и он все еще ускользает от меня.
Хотя ошибка случайна, я знаю, какой повторяющийся цикл шагов мне нужно повторить, чтобы в конечном итоге вызвать ее. Однако я запросил dbc.DBQLogTbl и просмотрел все SQL-запросы, которые были выполнены за 2 минуты до и после возникновения ошибки, и, похоже, ничего не выбирается из любой таблицы без блокировки доступа. Кроме того, после возникновения ошибки я нажму F5 повторно отправлю веб-форму обратно на сервер, чтобы повторить тот же набор обновлений, и он будет работать.
Я догадываюсь, что какой-то процесс за пределами нашего приложения ASP.NET блокирует таблицу, поскольку я проверил весь SQL, выполняемый нашим приложением. Я думаю, что должен быть способ узнать, какой именно SQL был выполнен, который заблокировал таблицу.
8/9/2012 Дополнительная информация: В этом порядке в рамках одной транзакции происходит все следующее:
- обновить таблицу сотрудников
- блокирующая строка для доступа select * from employeeesecurity, где empid = X (сделайте это, чтобы получить текущую запись сотрудника, чтобы увидеть, не изменилось ли что-нибудь)
- если есть изменения, обновите вышеупомянутую запись о безопасности сотрудников
- обновить таблицу employeeconfig (здесь всегда возникает ошибка взаимоблокировки)
Я не упоминал об этом раньше, но ошибка взаимоблокировки возникает в таблице, из которой я вообще не выбираю. Когда страница загружается, я читаю из представления employeeconfig, но в представлении указано locking row for access
.
Ответьте на 4 вопроса Роба:
- Это всего лишь одна транзакция.
- Как я сказал в своем последнем обновлении, заблокированная таблица - это даже не та таблица, из которой выбирается.
- Во всех запросах используется
locking row for access
- Выбираем из вида
employeeconfig
. Это представление выбирает из таблицыemployeeconfig
с помощьюlocking row for access
. Мы не используемlocking row for access
при запросе самого представления.
Что касается обработки тупика, я бы не хотел, чтобы код просто пытался повторно отправить его, поскольку это похоже на проблему, которую необходимо исправить. Как ты сказал, Роб, возможно, мой доступ к dbc.DBQLogTbl
ограничен, поэтому, возможно, я просто не могу видеть все, что происходит. Я был в контакте с администратором баз данных и свяжусь с вами сегодня снова.
update employeeconfig set field = x where id = y
. - person oscilatingcretin   schedule 09.08.2012[Teradata Database] [3778] SELECT statement must follow LOCK ROW modifier.
- person oscilatingcretin   schedule 09.08.2012