Выбор ответа Senior NoSQL и выбор хранилища обновлено

PgBouncer в режиме transaction pooling

Вопрос

Приложение перевели на PgBouncer с pool_mode = transaction. Что из этого может перестать работать правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Сессионное состояние: SET без LOCAL, LISTEN. В режиме transaction pooling серверное соединение выдаётся клиенту только на время транзакции, а следующая транзакция того же клиента может пойти через другое соединение.

Варианты ответа

  1. Обычные SELECT и UPDATE внутри явных транзакций
  2. Параметризованные запросы, отправленные одним сообщением
  3. Сессионное состояние: SET без LOCAL, LISTENправильный ответ
  4. Транзакции с уровнем изоляции Serializable и повторами

Разбор

В режиме transaction pooling серверное соединение выдаётся клиенту только на время транзакции, а следующая транзакция того же клиента может пойти через другое соединение. Всё, что живёт в сессии базы, становится непредсказуемым: SET search_path применится к чужому соединению, advisory lock останется висеть на соединении, LISTEN не будет получать уведомления. Транзакции целиком, включая Serializable, работают нормально, ведь транзакция не разрывается. Решения: SET LOCAL внутри транзакции, транзакционные advisory-блокировки, отдельный пул в режиме session для таких задач.

Ответьте сами, а не прочитайте

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