SELECT 1 - 事务空闲

Mic*_*hal 6 postgresql

在我的数据库负载问题中,我发现了一个新的、奇怪的问题。我知道,IDLE IN TRANSACTION当我在应用程序层中做错了什么时,某些查询可能处于状态。但是,刚才我发现这个查询现在有近 20 秒的状态:

SELECT 1;
Run Code Online (Sandbox Code Playgroud)

这是 JBoss AS 的内部机制,检查连接是否仍然有效。我无法理解它是如何在交易中闲置的。欢迎任何提示。

dez*_*zso 7

idle in transaction 几乎意味着它所暗示的:目前有一个开放的交易什么都不做。

您所看到的可以轻松重现。在一个会话中执行以下操作(如有必要,请在客户端中禁用自动提交 - 通常不是,显式BEGIN;会自动执行此操作):

test=>
    BEGIN;

    SELECT 1;
Run Code Online (Sandbox Code Playgroud)

在另一个会话中,让我们看看它的外观pg_stat_activity

test=> SELECT pid, 
              datname, 
              usename, 
              xact_start, 
              query_start, 
              state, 
              state_change, 
              query,
              now() 
       FROM pg_stat_activity;

pid          ? 13639
datname      ? test
usename      ? dezso
xact_start   ? 2015-10-23 10:14:36.853529+02
query_start  ? 2015-10-23 10:15:15.838252+02
state        ? idle in transaction
state_change ? 2015-10-23 10:15:15.838365+02
query        ? SELECT 1
now          ? 2015-10-23 10:16:24.340721+02
Run Code Online (Sandbox Code Playgroud)

在这里我们看到四种不同的时间戳:

  • 交易开始的时间(xact_start),
  • 查询开始的时间 ( query_start),
  • 事务状态上次更改的时间(state_change我想这是查询的结尾)和
  • 当前时间戳(运行上述查询时)。

在最后两个事务之间,事务处于空闲状态,但仍显示最后一个查询。

回答您的问题:默认情况下,许多客户端都禁用了自动提交。在这种情况下,当SELECT 1;发出第一个命令(例如)时,事务会以静默方式启动- 然后永远不会关闭。在这种情况下,您将看到您当前的体验和我在上面复制的内容。

AFAIK 有一种方法可以说服 JBoss AS 将其关闭。这可能会有所帮助:https : //developer.jboss.org/wiki/Non-transactionaldataaccessandtheauto-commitmode