Операция выполнена!
Закрыть
Хабы: PostgreSQL, Администрирование баз данных

РostgreSQL автоматически обнаруживает взаимоблокировки. В статье рассматривается процедура обнаружения взаимоблокировок, трудоёмкость процедуры обнаружения, причины, по которым параметр конфигурации log_lock_waits зависит от параметра deadlock_timeout и что влияет на выбор его значения.

Обычно, приводятся примеры взаимоблокировки двух процессов, но заблокироваться может и более двух процессов. Параметр конфигурации deadlock_timeout устанавливает время ожидания получения блокировки, по истечении которого будет выполняться проверка на наличие взаимоблокировки. Параметр log_lock_waits типа boolean (по умолчанию false) позволяет получить в логе кластера сообщение о том, что сессия ждёт получения блокировки дольше, чем значение deadlock_timeout.

Процедура обнаружения взаимоблокировок

Если процесс не может получить блокировку, то он засыпает и устанавливает себе таймер, чтобы проснуться через время, заданное параметром конфигурации deadlock_timeout (по умолчанию 1 секунда). Процесс проснётся до истечения таймаута, если блокировка ему будет предоставлена. По завершению таймаута процесс начинает процедуру обнаружения взаимоблокировки.

Процедура обнаружения взаимоблокировок относительно трудоёмка, так как набор блокировок не дерево, а граф. В графе проверяется наличия колец, которые указывают на взаимоблокировки.

Если взаимоблокировки нет, то процесс снова заснёт и больше не будет проверять, есть ли взаимоблокировка до получения блокировки или прерывания транзакции в соответствии с параметрами transaction_timeout и аналогичными параметрами. Почему процесс не будет дальше поверять ситуацию возникновения взаимоблокировки с частотой deadlock_timeout?

Читать далее
Читайте также
НОВОСТИ

ПИШИТЕ

Техническая поддержка проекта ВсеТут

info@vsetut.pro