Прежде чем начинать подробно изучать устройство взаимной блокировки, попробуем разобраться в том, как Oracle обнаруживает ситуации взаимного блокирования. В будущем это позволит нам проще понять этот механизм при некоторых сложных сценариях развития взаимной блокировки, а также позволит лучше ориентироваться в содержимом трассировочного файла взаимного блокирования.
В Oracle, как и в других современных СУБД, поиск ситуаций взаимного блокирования происходит постоянно. Вначале строится так называемый граф ожидания транзакций. Граф состоит из вершин и соединяющих их рёбер. Существуют два типа вершин – это вершины, соответствующие транзакциям или сеансам, и вершины, представляющие из себя ресурсы или объекты. Ребра в данном случае представляют собой блокировки. Если блокировка установлена, то ребро направлено от вершины соответствующей сеансу к вершине, определяющей ресурс. Если же ожидается установка блокировки, то наоборот ребро направлено от вершины ресурса к вершине, соответствующей сеансу. Если в этом сплетении рёбер и вершин обнаруживается цикл, то это означает, что возникла ситуация взаимного блокирования. При этом Oracle должен выбрать и отменить одно из ожидающих рёбер, что приведёт к разрыву цикла и нормализации ситуации.
В дальнейшем для некоторых сложных сценариев взаимной блокировки мы будем приводить схематическое изображение графа ожидания транзакций, что позволит нам увидеть взаимную блокировку в графическом виде.