2017-07-04 9 views
2

小さなテーブル(700行)で非常に単純な削除(キー単位)が行われ、すべての(現在は700ミリ秒)ロックは「付与済み」としてマークされます。postgresqlすべてのロックが付与された「トランザクション内のアイドル」

原因を特定するにはどうすればよいですか? 私はこの選択を使用しています:

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」Sの多くを示していますが、すべてが付与されています。

+0

idle in transactionはコミット/ロールバック/エンドを実行しなかったことを意味します。トランザクションの共有を持つプールに接続しています –

+0

トランザクションはSpring @ Transactionによって処理され、通常は正常ですが、この状態が分の – Leo

答えて

2

これはアプリケーションサーバーの問題です。

セッションは、アプリケーションがCOMMITまたはROLLBACKを使用してトランザクションを終了しないときに状態 "ile in transaction"になります。これは、アプリケーションのバグとみなされます。

トランザクションが終了するまで、ロックは残っています(そうでなければセッションはアイドル状態ではありません)。

PostgreSQL 9.6以降では、パラメータidle_in_transaction_session_timeoutを設定して、トランザクションを自動的に終了させることができます(ROLLBACK)。これは解決策ではなくデータベース上の問題を避けるためのものです。

+0

のため、アプリが実際にクエリを実行することは不可能ですか? 「アイドル・トランザクション」とは、クエリ(削除)がすでに完了して返されたが、トランザクションがコミットされていないことを意味します。 – Leo

+0

はい、正確です。 SQL文は終了し、アプリケーションはまだコミットされておらず、データベースはトランザクション内の次の文を待っています。 –

関連する問題