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

时间:2015-01-27 16:34:49

标签: postgresql transactions postgresql-9.3

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

current_setting('transaction_isolation')

我想打电话给:

session_setting('transaction_isolation', backend_pid )

找出现有会话/连接/后端实际使用的事务隔离级别。

背景

我有一个问题,我认为自动真空卡住了。手动运行真空会使某些表保留许多(比方说一百万)死元组。 我认为,这会大大降低性能。此类表上的单行更新可能需要一秒钟。它通常需要一毫秒。

查看pg_stat_activity有很多应用程序访问此数据库。 杀掉任何长时间打开的读/写事务一次有助于解决问题。 (真空运行,第二次吞吐量大约增加1000倍) 在其他情况下,这种方法不起作用。 似乎某些读取会话可能导致问题,即使他们不查询可疑表。如果我们说这些其他应用程序的会话正在使用顺序读取事务隔离,这可能是有意义的。 我认为其他一些应用程序正在使用JDBC。一些ODBC。还有一些PgAmdins也加入进来。

很难找到如何直接在某些监控/报告工具的内容中创建连接/会话。

默认的transaction_isolation是正常的read-committed。 我们正在运行v9.3 postgres。

2 个答案:

答案 0 :(得分:8)

您可以通过运行SHOW all来显示所有信息。 如果要显示隔离级别,请执行以下命令:

SHOW default_transaction_isolation

答案 1 :(得分:1)

我认为没有办法从另一个会话中查看一个会话。 (我可能错了。)

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

logging_collector = on
log_statement = 'all'

重启服务器。

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

所以你假设隔离级别是“read committed”,除非你记录了不同的隔离级别。