Некоторые методы обнаружения и устранения взаимных блокировок в современных СУБД:
Для обнаружения используют построение и анализ графа ожидания. 1 В нём узлами отмечают процессы и объекты, а блокировки и ожидания отмечают рёбрами. 1 Цикл в графе ожидания соответствует взаимной блокировке. 1 Для поиска циклов в графе применяют специальный алгоритм. 1
Для устранения применяют, например, принудительное освобождение запроса к одному из ресурсов. 5 При этом не должна пострадать уже начатая транзакция сеанса. 5 СУБД отменяет последнее действие, которое привело к ситуации взаимного блокирования, и предоставляет сеансу решить, зафиксировать ли изменения в данных или отменить их. 5
Ещё один метод — разработка иерархии блокировок. 1 Между блокировками устанавливают отношение сравнения и вводят правило о запрете захвата «большей» блокировки в состоянии, когда уже захвачена «меньшая». 1 Если процессу нужно несколько блокировок, он начинает с самой «большой», предварительно освобождая все захваченные «меньшие», и затем действует в нисходящем порядке. 1
Для минимизации взаимоблокировок рекомендуют, например, осуществлять доступ к объектам в одинаковом порядке, уменьшать размер транзакций, использовать низкий уровень изоляции, изоляцию моментальных снимков и связанные соединения. 3