[英]postgresql "idle in transaction" with all locks granted
一個非常簡單的刪除(鍵)小表(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
或ROLLBACK
結束事務時,會話處於“事務中空閑”狀態。 這被認為是應用程序中的錯誤。
在事務結束之前,鎖保持(並且當然被授予,否則會話不能空閑)。
從PostgreSQL 9.6開始,您可以設置參數idle_in_transaction_session_timeout
以使用ROLLBACK
自動終止此類事務,但這是一個創可貼以避免數據庫上的問題而不是解決方案。
這也可能是由於 1) 連接池耗盡 2) 事務中的事務 3) 事務中的隱式 postgres 事務的組合。 這篇文章讓我對這個問題大開眼界 https://www.birdie.care/blog/birdie-engineering-update
這就解釋了為什么數據庫本身沒有死鎖。 這只是因為達到了應用程序的連接池上限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.