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

deadlock_timeout (integer)

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

Когда включен параметр 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, при котором сохраняется поведение, наблюдавшееся в предыдущих версиях QHB. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

max_pred_locks_per_page (integer)

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