2015-09-08 3 views
4

Я смотрю, что Postgres Docs и, похоже, не упоминает, что происходит с Row Lock, это соединение с таймаутом или транзакция остается закрытой. Безопасно ли это использовать? Что происходит, когда поток с веб-сервера приобрел блокировку строк, а затем истекает время? Если соединение будет выгружено, будет заблокирован замок? Что, если это не так?Что происходит с блокировкой строк Postgres при сбое соединения?

Единственная гарантия, которую я нашел в документах, - statement_timeout, но я полагаю, что позже это повлияет на Чтения, а также на Writes, что не является предполагаемым эффектом.

statement_timeout (целое число)

Прервать любой оператор, который больше, чем заданное количество миллисекунд, начиная с момента, когда команда прибывает на сервере от клиента. Если для параметра log_min_error_statement установлено значение ERROR или ниже, также будет зарегистрирован отчет о времени ожидания. Значение нуля ( по умолчанию) отключает это.

Установка statement_timeout в postgresql.conf не рекомендуется, так как это повлияет на все сеансы.

ответ

4

Когда соединение заканчивается открытой транзакцией, транзакция откатывается (прерывается). Это освобождает все блокировки строк.

Тайм-аут соединения не то, что PostgreSQL делает сам, это делается стеком TCP операционной системы. TCP keepalives полезны для этого.

Отметьте, что statement_timeout отметит, что транзакция отменена, но не откат ее и освобождение ее замков. Вы все еще должны ROLLBACK. В PostgreSQL нет «тайм-аута транзакции» или любого тайм-аута соединения на уровне сервера базы данных.

Если вы пытаетесь ограничить длительные блокировки строк, вы, вероятно, захотите провести мониторинг pg_locks и pg_stat_activity. Особый интерес представляют колонка waiting от pg_stat_activity и столбец granted от pg_locks. См. https://wiki.postgresql.org/wiki/Lock_Monitoring

+0

Спасибо за ответ. Что определяет время ожидания соединения (например, что, если веб-сервер является OOM и сильно подкачки на диск таким образом, который останавливает весь процесс, не выгружая его)? Есть ли способ установить ограничение таймаута транзакции в начале транзакции? – user3467349

+0

Отсутствует тайм-аут соединения или тайм-аут для транзакций бездействия, только тайм-аут инструкции. Единственный тайм-аут соединения находится на более низком уровне, если соединение TCP разрывается. Если keepalives не включен, это занимает * длительное время, и даже с keepalives это не быстро. Это предполагает, что одноранговый хост полностью не отвечает; если вместо этого он отвечает TCP RST, он будет прерываться быстро. Если веб-сервер прерывается/останавливается, соединения с базой данных, вероятно, останутся открытыми и неактивными. Зачем? в чем основная проблема, которую вы пытаетесь решить здесь? –

+0

Я просто ищу определенные уверения, которые говорят, что один сервер, который может начать останавливаться после принятия блокировки строк, может блокировать другие серверы для ограниченного (прогнозируемого) количества времени. Это лучший способ сделать это, чтобы разделить пулы чтения и записи и установить statement_timeout на уровне соединения? – user3467349