postgresql“在事务中空闲”,授予所有锁定

时间:2017-07-04 14:02:00

标签: sql postgresql locking

一个小表(700行)上的一个非常简单的删除(通过键),然后保持“在事务中空闲”几分钟(通常需要几毫秒),即使所有锁被标记为“已授予”。

我该如何确定导致它的原因? 我正在使用这个选择:

  SELECT a.datname,
     c.relname,
     l.transactionid,
     l.mode,
     l.GRANTED,
     a.usename,
     a.waiting,
     a.query, 
     a.query_start,
     age(now(), a.query_start) AS "age", 
     a.pid 
FROM  pg_stat_activity a
 JOIN pg_locks         l ON l.pid = a.pid
 JOIN pg_class         c ON c.oid = l.relation
ORDER BY a.query_start;

显示了很多“RowExclusiveLock”,但都被授予了...所以我看不出是什么导致了这种延迟的高峰。

1 个答案:

答案 0 :(得分:5)

这是应用程序服务器的问题。

会话处于状态"闲置在事务中"当应用程序未使用COMMITROLLBACK结束交易时。这被视为应用程序中的错误。

在事务结束之前,锁仍然存在(并且当然被授予,否则会话不能空闲)。

从PostgreSQL 9.6开始,您可以设置参数idle_in_transaction_session_timeout以使用ROLLBACK自动终止此类事务,但这是一个创可贴以避免数据库上的问题而不是解决方案。< / p>