Найти все операторы, вовлеченные в тупик, из файла трассировки Oracle? - PullRequest
2 голосов
/ 31 января 2012

Насколько я понимаю, типичный случай взаимоблокировки с блокировкой строки требует четырех операторов SQL.Два в одной транзакции для обновления строки A и строки B, а затем еще две в отдельной транзакции для обновления тех же строк и требуют одинаковых блокировок, но в обратном порядке.

Транзакция 1 получает блокировку строки A, прежде чем транзакция 2 сможет запросить ее, транзакция 2 получает блокировку строки B до того, как транзакция 1 сможет ее получить, и ни одна из них не сможет получить оставшиеся требуемые блокировки.Необходимо выполнить откат одной или любой транзакции, чтобы можно было выполнить другую.

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

Как я могу определить другие операторы, участвующие в каждой транзакции, или это отсутствует в файле трассировки Oracle?

Я могу включить соответствующиебиты конкретного файла трассировки, если требуется.

1 Ответ

5 голосов
/ 01 февраля 2012

Вы правы, в типичном тупике на уровне строк у вас будет сеанс 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 отсутствует в трассировке, и она действительно недоступна.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...