Ошибка ORA-00060: deadlock detected — поиск взаимоблокировок в Oracle DB
- Ошибка
ORA-00060: deadlock detected while waiting for resourceв журнале приложения. - Oracle автоматически генерирует trace-файл инцидента в каталоге
diag/rdbms/.../trace. - Один из участников взаимоблокировки автоматически откатывает текущую команду (Statement Rollback), позволяя второму процессу завершиться.
1. Поиск и анализ Deadlock Trace файла
Найдите в alert.log запись об ошибке ORA-00060 и путь к файлу трассировки:
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';Внутри trace-файла найдите секцию DEADLOCK DETECTED ( ORA-00060 ) и граф взаимоблокировки (Deadlock Graph):
--------- Deadlock Graph ---------
Wait-for-cmd Holds Waits
Branch sid sql_id mode mode
1 142 8g7d2k1m X X
2 385 4k9m1b6n X X2. Проверка неиндексированных внешних ключей (Foreign Keys)
Самая частая причина дедлоков в Oracle — отсутствие индексов на дочерних таблицах с внешними ключами, что вызывает полную блокировку родительской/дочерней таблицы при DML:
SELECT acc.owner, acc.table_name, acc.constraint_name, acc.column_name, acc.position
FROM all_cons_columns acc
JOIN all_constraints ac ON acc.owner = ac.owner AND acc.constraint_name = ac.constraint_name
WHERE ac.constraint_type = 'R'
AND NOT EXISTS (
SELECT 1 FROM all_ind_columns aic
WHERE aic.table_owner = acc.owner
AND aic.table_name = acc.table_name
AND aic.column_name = acc.column_name
AND aic.column_position = acc.position
);3. Унификация порядка обновления данных в транзакциях
Убедитесь, что все бизнес-транзакции обращаются к таблицам и строкам в одинаковом порядке (например, сортируя ID строк перед выполнением UPDATE или SELECT FOR UPDATE).
4. Проверка параметра ITL (Interested Transaction List)
Если взаимоблокировка происходит на уровне блока данных (TX lock mode 4), увеличьте INITRANS таблицы/индекса:
ALTER TABLE my_table INITRANS 10; Частые вопросы (FAQ)
Убивает ли Oracle всю транзакцию при возникновении ORA-00060?
Нет! Oracle откатывает только тот SQL-запрос, который замкнул цикл дедлока. Сама транзакция остается активной. Приложение должно явно вызвать ROLLBACK или COMMIT, иначе блокировки остальных строк продолжат удерживаться.
Почему отсутствие индекса на Foreign Key приводит к взаимоблокировкам?
При изменении первичного ключа или удалении строки в родительской таблице без индекса на FK дочерней таблицы Oracle вынужден накладывать разделяемую блокировку на всю дочернюю таблицу целиком, блокируя любые параллельные операции вставки и изменения.
Что такое ITL Deadlock (TX lock mode 4)?
Это дедлок, возникающий не из-за строк данных, а из-за нехватки слотов транзакций в заголовке блока данных. Несколько сессий пытаются модифицировать строки в одном физическом блоке диска, где исчерпан лимит INITRANS/MAXTRANS.
Можно ли полностью отключить обнаружение дедлоков в Oracle?
Нет, механизм обнаружения дедлоков встроен в фоновые процессы ядра СУБД (LMD/LMS в RAC или серверные процессы) и является фундаментальной гарантией защиты базы от вечных циклических блокировок.