Подведём небольшой итог изучения взаимных
Подведём небольшой итог изучения взаимных блокировок:
Взаимная блокировка может возникать только между двумя и более сеансами. Всё остальное – это баги (ошибки) Oracle.
В каждом сеансе обязательно должна быть открыта транзакция.
В пределах каждой транзакции должны присутствовать как минимум две блокировки в исключительных режимах. Причём одна из них должна быть установленной, а другая ожидающей.
Из этих установленных и ожидающих блокировок должна быть выстроена цепочка, в которой ожидающая блокировка в одном сеансе ссылалается на установленную блокировку в другом сеансе.
Данная цепочка должна замыкаться. То есть последняя ожидающая блокировка в цепочке должна ожидать первую установленную блокировку.
Транзакционные блокировки должны быть установлены или ожидать строки ранее зафиксированные транзакциями. То есть заблокированные строки должны быть видимы для других сеансов, что, к примеру, невозможно при вставках строк.
Одинаковая последовательность обработки ресурсов в большинстве случаев предотвращает взаимное блокирование.
Поиск ситуаций взаимного блокирования осуществим всегда, при этом используется граф ожидания транзакций.
Цикл графа ожидающих транзакций соответствует взаимной блокировке, независимо от того, может ли ситуация разрешиться другими способами.
Взаимная блокировка иногда может приводить к зависанию приложения, а не к вызову исключения.
Содержание раздела