如何查询现有 postgres 会话的事务隔离级别?

How can I query the transaction-isolation level of an existing postgres session?

我希望能够查询另一个现有会话中的设置。特别是 transaction_isolation。我们有:

current_setting('transaction_isolation')

我想这样调用:

session_setting('transaction_isolation', backend_pid )

找出现有 session/connection/back-end 实际使用的 t运行saction 隔离级别。

背景

我们遇到了一个问题,我认为自动吸尘器卡住了。 运行 vacuum 手动留下某些表 许多 (比如一百万)剩余的死元组。 我认为,这会大大降低性能。此类表上的单行更新可能需要一秒钟的时间。通常需要一毫秒。

调查 pg_stat_activity 有相当多的应用程序访问此数据库。 关闭任何 long open read/write t运行saction once 有助于解决问题。 (Vacuum 运行,一秒钟后吞吐量跃升了大约 1000 x) 在其他情况下,该方法不起作用。 似乎某些读取会话可能导致问题,即使它们不查询可疑表也是如此。如果我们说这些其他应用程序的会话正在使用顺序读取 t运行saction 隔离,这可能是有道理的。 我认为其他一些应用程序正在使用 JDBC。一些ODBC。还有一些 PgAmdins 也加入了。

很难弄清楚 connections/session 是如何直接在某些 monitoring/reporting 工具的内部创建的。

默认transaction_isolation是正常读提交。 我们是 运行 v9.3 postgres。

我认为没有任何方法可以从另一个会话中查看一个会话。 (我可能是错的。)

我能想到的唯一选择是扩展您的日志记录。在postgresql.conf中设置

logging_collector = on
log_statement = 'all'

重新启动服务器。

这将记录所有 SQL 语句,包括设置事务隔离级别的语句。有很多设置; log_connections 可能有用。

因此,除非您记录不同的隔离级别,否则您会假设隔离级别为 "read committed"。

您可以通过运行宁SHOW all显示所有信息。 如果你想显示隔离级别 运行 这个:

SHOW default_transaction_isolation