PgBouncer в режиме transaction pooling
Вопрос
Приложение перевели на PgBouncer с pool_mode = transaction. Что из этого может перестать работать правильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Обычные
SELECTиUPDATEвнутри явных транзакций - Параметризованные запросы, отправленные одним сообщением
- Сессионное состояние:
SETбезLOCAL,LISTENправильный ответ - Транзакции с уровнем изоляции Serializable и повторами
Разбор
В режиме transaction pooling серверное соединение выдаётся клиенту только на время транзакции, а следующая транзакция того же клиента может пойти через другое соединение. Всё, что живёт в сессии базы, становится непредсказуемым: SET search_path применится к чужому соединению, advisory lock останется висеть на соединении, LISTEN не будет получать уведомления. Транзакции целиком, включая Serializable, работают нормально, ведь транзакция не разрывается. Решения: SET LOCAL внутри транзакции, транзакционные advisory-блокировки, отдельный пул в режиме session для таких задач.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Физическая или логическая репликация
Следующий вопрос
Записал в мастер, не нашёл на реплике