Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

ORA-00060 1С:Предприятие и СУБД

Ошибка ORA-00060: deadlock detected — поиск взаимоблокировок в Oracle DB

Обновлено: 26.08.2026 · Официальная документация ↗
  • Ошибка 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     X

2. Проверка неиндексированных внешних ключей (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;
💡 Практика специалистов: Никогда не 'глушите' ORA-00060 простым циклом retry в коде без исправления архитектуры. Постоянные взаимоблокировки вызывают каскадную деградацию производительности СУБД из-за регулярной генерации тяжелых trace-дампов памяти.

Частые вопросы (FAQ)

Убивает ли Oracle всю транзакцию при возникновении ORA-00060?

Нет! Oracle откатывает только тот SQL-запрос, который замкнул цикл дедлока. Сама транзакция остается активной. Приложение должно явно вызвать ROLLBACK или COMMIT, иначе блокировки остальных строк продолжат удерживаться.

Почему отсутствие индекса на Foreign Key приводит к взаимоблокировкам?

При изменении первичного ключа или удалении строки в родительской таблице без индекса на FK дочерней таблицы Oracle вынужден накладывать разделяемую блокировку на всю дочернюю таблицу целиком, блокируя любые параллельные операции вставки и изменения.

Что такое ITL Deadlock (TX lock mode 4)?

Это дедлок, возникающий не из-за строк данных, а из-за нехватки слотов транзакций в заголовке блока данных. Несколько сессий пытаются модифицировать строки в одном физическом блоке диска, где исчерпан лимит INITRANS/MAXTRANS.

Можно ли полностью отключить обнаружение дедлоков в Oracle?

Нет, механизм обнаружения дедлоков встроен в фоновые процессы ядра СУБД (LMD/LMS в RAC или серверные процессы) и является фундаментальной гарантией защиты базы от вечных циклических блокировок.

Полезные материалы
Рекомендуем