Я хочу иметь возможность запрашивать настройки в другом существующем сеансе. В частности, 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.
idle in transaction
вpg_stat_activity
. Неважно, какой уровень изоляции используют эти транзакции. Вы должны убедиться, что все транзакции завершены правильно — даже сеансы только для чтения должны выполнятьcommit
(илиrollback
) по завершении. - person a_horse_with_no_name   schedule 28.01.2015