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

Posted

技术标签:

【中文标题】如何查询现有 postgres 会话的事务隔离级别?【英文标题】:How can I query the transaction-isolation level of an existing postgres session? 【发布时间】: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,谢谢。我会重新考虑这种可能性。 【参考方案1】:

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

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

logging_collector = on
log_statement = 'all'

重启服务器。

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

因此,除非您记录不同的隔离级别,否则您会假设隔离级别是“已提交读”。

【讨论】:

【参考方案2】:

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

SHOW default_transaction_isolation

【讨论】:

这将显示 当前 会话的设置。不用于不同的会话。 在我的情况下 SHOW default_transaction_isolation 什么都不返回。test=# SHOW default_transaction_isolation test-# test-# 这仅显示默认隔离级别,而不是当前会话的隔离级别。如果要查看当前会话的隔离级别,可以使用SHOW TRANSACTION ISOLATION LEVEL; 此评论应移至(已接受)答案

以上是关于如何查询现有 postgres 会话的事务隔离级别?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL事物隔离级别及搜索引擎

MySQL事务

MySQL事务

MySQL事务与存储引擎

MySQL索引事务及存储引擎

MySQL索引事务及存储引擎