Сам файл трассировки содержит множество данных; в том числе, здесь находится и полный дамп состояния процессов Oracle на момент возникновения взаимной блокировки. Но нам важны только несколько секций файла. Первая из них – это текущий SQL-оператор сеанса, который столкнулся с ошибкой взаимной блокировки и был отменён. Для этого находим в файле строку DEADLOCK DETECTED. Чуть ниже неё, после ключевых слов «Current SQL statement for this session» будет находиться необходимая нам секция:
Current SQL statement for this session: UPDATE t1 SET c2 = 'Строка2' WHERE c1 = 2
Вторая секция, которая нас заинтересует – это граф взаимной блокировки. Он находится после ключевой строки Deadlock graph и отображает цепочку захватов и ожиданий блокировок между сеансами:
Deadlock graph: ---------Blocker(s)-------- ---------Waiter(s)--------- Resource Name process session holds waits process session holds waits TX-00040016-000000a9 20 28 X 21 24 X TX-00050026-000000a3 21 24 X 20 28 X
Вспомним, как Oracle обнаруживает блокировки. Для этого он постоянно строит граф ожидания транзакций. Если в этом графе обнаружен цикл, то это означает, что возникла взаимная блокировка. Так вот именно этот цикл и отображается в секции Deadlock graph, правда в очень специфическом виде.
Визуально граф представлен в виде таблицы, которая разделена на три логических блока. Первый блок обозначает ресурсы, участвующие во взаимной блокировке. В нашем случае таким ресурсом является блокировка транзакции. Ресурс обозначается символьным кодом TX, после которого идет идентификатор транзакции в шестнадцатеричном виде. Именно этот идентификатор, но только в десятичном виде мы получили, когда расшифровывали значения столбцов ID1 и ID2 представления v$lock. Второй блок состоит из столбцов, содержащих информацию о сеансах, удерживающих данную блокировку, а также режиме, в котором эта блокировка установлена. И наконец, третий блок аналогичен второму, но противоположен по содержанию. Он хранит информацию о сеансах, которые сделали запрос на установление блокировки, но вынуждены ожидать освобождения блокировки из второго блока.