Вы правы, в типичном тупике на уровне строк у вас будет сеанс 1, выполняющий sql_a, который заблокирует строку 1. Затем сеанс 2 выполнит sql_b, который заблокирует строку 2. Затем сеанс 1 выполнит sql_c, чтобы попытатьсязаблокировать строку 2, но сеанс 2 не зафиксирован, и поэтому сеанс 1 начинает ожидание.Наконец, начинается сеанс 2, и он запускает sql_d, пытаясь заблокировать строку 1, но, поскольку сеанс 1 удерживает эту блокировку, он начинает ждать.Через три секунды обнаруживается взаимоблокировка, и один из сеансов перехватывает ORA-00060 и записывается файл трассировки.
В этом случае файл трассировки будет содержать sql_c и sql_d, но не sql_a или sql_b.
Проблема в том, что информация просто нигде не доступна.Предположим, что вы выполняете DML, он запускает транзакцию, если она не существует, генерирует кучу отмен и повторов, и изменения вносятся.Но как только это происходит, сеанс больше не ассоциируется с этим оператором SQL.На самом деле нет чистого способа вернуться и найти эту информацию.
sql_c и sql_d, с другой стороны, - это операторы, которые были связаны с этими сеансами, когда возникла тупиковая ситуация, поэтому, очевидно, Oracle может их идентифицироватьи включите это в файл трассировки.
Итак, вы правы, информация о sql_a и sql_b отсутствует в трассировке, и она действительно недоступна.
Надеюсь, что это поможет.