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

Mar*_*inP 6 postgresql transactions postgresql-9.3

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

current_setting('transaction_isolation')
Run Code Online (Sandbox Code Playgroud)

我想打电话给:

session_setting('transaction_isolation', backend_pid )
Run Code Online (Sandbox Code Playgroud)

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

背景

我们有一个问题,我认为自动真空卡住了.手动运行真空会使某些表格中剩余许多(例如一百万个)死元组.我认为,这会大大降低性能.此类表上的单行更新可能需要一秒钟.它通常需要一毫秒.

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

很难找到如何在一些监控/报告工具的内部直接创建连接/会话.

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

小智 12

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

SHOW default_transaction_isolation
Run Code Online (Sandbox Code Playgroud)

  • 这仅显示 DEFAULT 隔离级别,而不显示当前会话的隔离级别。如果您想查看当前会话的隔离级别,可以使用“SHOW TRANSACTION ISOLATION LEVEL;” (8认同)
  • 这将显示 _current_ 会话的设置。不适用于不同的会话。 (3认同)

Mik*_*ll' 6

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

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

logging_collector = on
log_statement = 'all'
Run Code Online (Sandbox Code Playgroud)

重新启动服务器。

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

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


Moh*_*avi 6

正如@zubair-0 提到的:

如果你想查看当前会话的隔离级别,可以使用SHOW TRANSACTION ISOLATION LEVEL;