Взаимоблокировка состоит из двух сессий, блокирующих друг друга, поэтому Oracle должен отменить одну транзакцию, чтобы не допустить их блокировки на неопределенный срок.
Допустим, я удаляю элемент 1, а вы удаляете элемент 2, и никто из нас не подтверждает это.
Теперь я пытаюсь удалить элемент 2, но не могу, потому что ваше незафиксированное удаление блокирует строку, поэтому мой сеанс ожидает в заблокированном состоянии, чтобы вы либо зафиксировали, либо откатили удаление.
Теперь вы пытаетесь удалить элемент 1. Вы не можете, потому что мое незафиксированное удаление все еще блокирует эту строку. Теперь вы заблокированы моим сеансом, но я уже заблокирован вами. (Вам нужно, чтобы я либо зафиксировал, либо откатился, но я не могу ничего сделать, потому что я заблокирован вами.) Оба сеанса будут ждать вечно.
Oracle обнаруживает эту ситуацию и вмешивается, отменяя и откатывая одну из транзакций, вызывая ORA-00060 и записывая тупиковый отчет в журнал предупреждений базы данных.
Проверьте подробности в журнале оповещений и просмотрите логику приложения, чтобы предотвратить это в будущем.
Редактировать - спасибо за размещение подробностей трассировки.
Сессия 2274 ожидала 2566 (получить блокировку режима SSX).
Сессия 2566 ждала 1851 года.
Сессия 1851 ждала 2274.
Некоторые примечания по режимам блокировки: https://jonathanlewis.wordpress.com/2010/06/21/locks
SSX (share sub exclusive) связан с 'Lock table in share row exclusive mode'
. Иногда блокировки и связанные с ними режимы не очевидны, например, прямой путь insert
в таблицу или каскадное удаление через внешний ключ (особенно если дочерний ключ неиндексирован) приведет к блокировкам, которых вы, возможно, не ожидаете.
В ответах на этот вопрос также могут быть некоторые подсказки: Поиск причины тупиковой ошибки из файла трассировки оракула