即使所有锁都被标记为“已授予”,对小表(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”,但所有这些都被授予......所以我不明白是什么导致了这种延迟峰值。
这是应用服务器的问题。
当应用程序未使用以下命令结束事务时,会话处于“事务中空闲”状态COMMIT
or ROLLBACK
。这被视为应用程序中的错误。
锁将保留(当然是被授予的,否则会话不可能空闲)直到事务结束。
从 PostgreSQL 9.6 开始,可以设置参数idle_in_transaction_session_timeout自动终止此类交易ROLLBACK
,但这只是避免数据库出现问题的创可贴,而不是解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)