PostgreSQL автоматически выявляет взаимоблокировки и разрешает их, прерывая одну из сцепившихся транзакций и тем самым позволяя другой (другим) продолжить работу. 1
Процесс происходит так: когда процесс пытается захватить блокировку и не может, он встаёт в очередь и засыпает, но устанавливает таймер на значение, указанное в параметре deadlocktimeout (по умолчанию — 1 секунда). 5 Если ресурс освобождается раньше, то проверка не проводится. 5 Если по истечении deadlocktimeout ожидание продолжается, то ожидающий процесс разбужается и инициирует проверку. 5
Если взаимоблокировка выявлена, то одна из транзакций (в большинстве случаев — та, которая инициировала проверку) принудительно обрывается. 5 При этом освобождаются захваченные ей блокировки и остальные транзакции могут продолжать работу. 5
Чтобы предотвратить взаимоблокировки, рекомендуется, чтобы все приложения, обращающиеся к базе данных, запрашивали блокировки нескольких объектов единообразно. 1 Если заранее обеспечить такой порядок нельзя, взаимоблокировки можно обработать по факту, повторяя прерванные транзакции. 1