【发布时间】:2015-03-26 08:32:44
【问题描述】:
我希望能够在另一个现有会话中查询设置。特别是 transaction_isolation。我们有:
current_setting('transaction_isolation')
我想这样称呼:
session_setting('transaction_isolation', backend_pid )
找出现有会话/连接/后端实际使用的事务隔离级别。
背景
我们有一个问题,我认为 Auto-vacuum 会卡住。手动运行vacuum 会使某些表留下许多(比如一百万)个死元组。 我认为,这会大大降低性能。此类表的单行更新可能需要一秒钟以上。通常需要一毫秒。
查看 pg_stat_activity 有很多应用程序访问该数据库。 杀死任何长时间打开的读/写事务曾经有助于解决问题。 (真空运行,一秒钟后吞吐量跃升了大约 1000 倍) 在其他情况下,这种方法不起作用。 似乎某些读取会话可能会导致问题,即使他们不查询可疑表也是如此。如果我们说这些其他应用程序的会话正在使用顺序读取事务隔离,这可能是有道理的。 我认为其他一些应用程序正在使用 JDBC。一些 ODBC。也有一些 PgAmdin 加入。
很难在某些监控/报告工具的内部直接找出连接/会话是如何创建的。
默认的 transaction_isolation 是正常的已提交读。 我们正在运行 v9.3 postgres。
【问题讨论】:
-
我认为隔离级别与您的问题无关。您需要检查的是在
pg_stat_activity中状态为idle in transaction的会话。这些事务使用哪种隔离级别并不重要。您需要确保所有事务都正确结束——即使是只读会话也应该在完成时执行commit(或rollback) -
@a_horse_with_no_name,谢谢。我会重新考虑这种可能性。
标签: postgresql transactions postgresql-9.3