簡體   English   中英

已授予所有鎖的 postgresql“事務空閑”

[英]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”,但都被授予了......所以我看不出是什么導致了這種延遲高峰。

這是應用程序服務器的問題。

當應用程序未使用COMMITROLLBACK結束事務時,會話處於“事務中空閑”狀態。 這被認為是應用程序中的錯誤。

在事務結束之前,鎖保持(並且當然被授予,否則會話不能空閑)。

從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM