Leo*_*Leo 3 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;
Run Code Online (Sandbox Code Playgroud)
它显示了很多"RowExclusiveLock",但都被批准了...所以我看不出是什么导致了这种延迟的峰值.
这是应用程序服务器的问题.
当应用程序未使用COMMIT或结束事务时,会话处于"事务中空闲"状态ROLLBACK.这被认为是应用程序中的错误.
在事务结束之前,锁保持(并且当然被授予,否则会话不能空闲).
从PostgreSQL 9.6开始,您可以设置参数idle_in_transaction_session_timeout以自动终止此类事务ROLLBACK,但这是一个创可贴以避免数据库上的问题而不是解决方案.
| 归档时间: |
|
| 查看次数: |
4066 次 |
| 最近记录: |