19.12. Управление блокировками#

19.12. Управление блокировками

19.12. Управление блокировками

deadlock_timeout (integer)

Это количество времени, которое нужно подождать перед проверкой на наличие состояния взаимной блокировки. Проверка на взаимную блокировку относительно дорогая операция, поэтому сервер не выполняет ее каждый раз, когда ожидает блокировку. Мы оптимистично предполагаем, что взаимные блокировки не являются обычным явлением в производственных приложениях, и просто ждем блокировку некоторое время перед проверкой на взаимную блокировку. Увеличение этого значения уменьшает количество времени, затраченное на бесполезные проверки на взаимную блокировку, но замедляет обнаружение реальных ошибок взаимной блокировки. Если это значение указано без единиц измерения, оно считается миллисекундами. По умолчанию установлено одну секунду (1s), что, вероятно, является самым маленьким значением, которое вы захотите использовать на практике. На сильно нагруженном сервере вы можете захотеть увеличить это значение. Идеально, если установленное значение превышает типичное время выполнения транзакции, чтобы увеличить вероятность того, что блокировка будет освобождена до того, как ожидающий процесс решит проверить на наличие взаимной блокировки. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

Когда параметр log_lock_waits установлен, этот параметр также определяет временный тайм-аут перед выдачей сообщения в журнал о блокировке. Если вы пытаетесь исследовать задержки из-за блокировок, вам может понадобиться установить временный тайм-аут deadlock_timeout короче, чем обычно.

max_locks_per_transaction (integer)

Таблица общих блокировок отслеживает блокировки на объектах (например, таблицах) в количестве max_locks_per_transaction * (max_connections + max_prepared_transactions). Следовательно, одновременно может быть заблокировано не более этого количества различных объектов. Этот параметр контролирует среднее количество блокировок объектов, выделенных для каждой транзакции; отдельные транзакции могут блокировать больше объектов, при условии, что блокировки всех транзакций помещаются в таблицу блокировок. Это не количество строк, которые могут быть заблокированы; это значение неограничено. Значение по умолчанию, 64, исторически оказалось достаточным, но вам может потребоваться увеличить это значение, если у вас есть запросы, которые затрагивают множество различных таблиц в одной транзакции, например, запрос родительской таблицы с множеством дочерних таблиц. Этот параметр может быть установлен только при запуске сервера.

При работе с резервным сервером необходимо установить этот параметр на такое же или более высокое значение, чем на основном сервере. В противном случае запросы на резервном сервере не будут разрешены.

max_pred_locks_per_transaction (integer)

Таблица общих предикатных блокировок отслеживает блокировки на объектах (например, таблицах) в количестве max_pred_locks_per_transaction * (max_connections + max_prepared_transactions). Следовательно, одновременно может быть заблокировано не более этого количества различных объектов. Этот параметр контролирует среднее количество блокировок объектов, выделенных для каждой транзакции; отдельные транзакции могут блокировать больше объектов, при условии, что блокировки всех транзакций помещаются в таблицу блокировок. Это не количество строк, которые могут быть заблокированы; это значение неограничено. Значение по умолчанию, 64, обычно достаточно для тестирования, но вам может потребоваться увеличить это значение, если у вас есть клиенты, которые обращаются к множеству различных таблиц в одной сериализуемой транзакции. Этот параметр может быть установлен только при запуске сервера.

max_pred_locks_per_relation (integer)

Это управляет тем, сколько страниц или кортежей одного отношения может быть заблокировано предикатом, прежде чем блокировка будет распространена на всё отношение. Значения больше или равные нулю означают абсолютный предел, в то время как отрицательные значения означают max_pred_locks_per_transaction, делённый на абсолютное значение этого параметра. По умолчанию установлено значение -2, которое сохраняет поведение из предыдущих версий Tantor SE. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

max_pred_locks_per_page (integer)

Это управляет тем, сколько строк на одной странице может быть предикатно заблокировано, прежде чем блокировка будет распространена на всю страницу. По умолчанию значение равно 2. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.