Как я могу запросить уровень изоляции транзакций существующего сеанса postgres?

Я хочу иметь возможность запрашивать настройки в другом существующем сеансе. В частности, transaction_isolation. У нас есть:

current_setting('transaction_isolation')

Я хочу вызвать что-то вроде:

session_setting('transaction_isolation', backend_pid )

Чтобы узнать, какой уровень изоляции транзакций фактически используется существующим сеансом/подключением/серверной частью.

Фон

У нас есть проблема, из-за которой, как мне кажется, Auto-vacuum зависает. Запуск вакуума вручную оставляет определенные таблицы с многими (скажем, миллионом) оставшихся мертвых кортежей. Это, я думаю, сильно снижает производительность. Обновление одной строки в таких таблицах может занять больше секунды. Где обычно это занимает миллисекунду.

Глядя на pg_stat_activity, есть довольно много приложений, обращающихся к этой базе данных. Однократное уничтожение любой длинной открытой транзакции чтения/записи помогло решить проблему. (Вакуум запустился, а через секунду пропускная способность подскочила, наверное, в 1000 раз) В других случаях этот подход не работал. Кажется, некоторые сеансы чтения могут вызывать проблему, даже если они не запрашивают подозрительные таблицы. Это могло бы иметь смысл, если бы, скажем, изоляция транзакций последовательного чтения использовалась сеансами этих других приложений. Я думаю, что некоторые другие приложения используют JDBC. Какой-то ODBC. И к нам присоединяются несколько PgAmdins.

Трудно выяснить, как соединения/сеансы создаются непосредственно в недрах некоторых инструментов мониторинга/отчетности.

По умолчанию transaction_isolation является нормальным чтением-фиксацией. Мы используем v9.3 postgres.


person MartinP    schedule 27.01.2015    source источник
comment
Я не думаю, что уровень изоляции имеет отношение к вашей проблеме. Что вам нужно проверить, так это сеансы, которые имеют состояние idle in transaction в pg_stat_activity. Неважно, какой уровень изоляции используют эти транзакции. Вы должны убедиться, что все транзакции завершены правильно — даже сеансы только для чтения должны выполнять commit (или rollback) по завершении.   -  person a_horse_with_no_name    schedule 28.01.2015
comment
@a_horse_with_no_name, спасибо. я еще раз обдумаю эту возможность.   -  person MartinP    schedule 28.01.2015


Ответы (2)


Я не думаю, что есть какой-либо способ заглянуть в один сеанс из другого сеанса. (Я могу ошибаться.)

Единственная альтернатива, о которой я могу думать, - это расширить ваш журнал. В postgresql.conf установите

logging_collector = on
log_statement = 'all'

Перезапустите сервер.

При этом будут зарегистрированы все операторы SQL, включая те, которые устанавливают уровень изоляции транзакций. Есть много настроек; log_connections может быть полезным.

Таким образом, вы предполагаете, что уровень изоляции «зафиксирован чтением», если вы не зарегистрируете другой уровень изоляции.

person Mike Sherrill 'Cat Recall'    schedule 28.01.2015

Вы можете показать всю информацию, запустив SHOW all. Если вы хотите показать уровень изоляции, выполните следующее:

SHOW default_transaction_isolation
person Cemil Dogan    schedule 30.01.2016
comment
Это покажет настройку для текущего сеанса. Не для другого сеанса. - person a_horse_with_no_name; 30.01.2016
comment
в моем случае SHOW default_transaction_isolation ничего не возвращает.test=# SHOW default_transaction_isolation test-# test-# - person Alec; 10.10.2018
comment
Это показывает только уровень изоляции ПО УМОЛЧАНИЮ, а не уровень изоляции для текущего сеанса. Если вы хотите увидеть уровень изоляции для текущего сеанса, вы можете использовать SHOW TRANSACTION ISOLATION LEVEL; - person zubair-0; 13.01.2020