У нас есть веб-сервис, где все пользовательские транзакции чтения / записи выполняются с уровнем изоляции SERIALIZABLE. Однако у нас были проблемы, когда длина транзакции некоторых соединений проходит через крышу, и кажется, что в большинстве (всех?) Случаях проблема была в запросе ROLLBACK TRANSACTION
. Соединения, останавливающиеся в этом состоянии, видны в таблице pg_stat_activity
.
Если только я что-то не так понял, откат транзакции SERIALIZABLE всегда должен быть успешным без каких-либо блокировок и практически не требует ресурсов для выполнения на PostgreSQL.
Что может вызвать зависание транзакции SERIALIZABLE на ROLLBACK TRANSACTION
?
Мы запускаем соединения через pgbouncer
версии 1.7, работающие на localhost
, используя pool_mode=transaction
в случае, если это имеет значение. Выполнение select pg_terminate_backend(123)
, где 123
- нарушающее соединение, не сразу освобождает запрос с точки зрения клиента. Клиент видит что-либо только через 1 ч после запроса, а затем я получаю ответ:
57P01 terminating connection due to administrator command
08P01 server conn crashed?