2017-01-02 8 views
4

私はpg_stat_activityをクエリしましたが、plqgsql関数本体、SERIALIZABLEまたはREPEATABLE READトランザクション内で最初にクエリを実行した後にその内容が変わらないようです。pg_stat_activityはプロシージャまたはトランザクション内で更新されません

pg_stat_activityがplpgsqlプロシージャのREAD COMMITTEDのルールに従わないのはなぜですか?

どのようにして現在のステータスを取得できますか?別のバックエンドで実行中の別のクエリが終了するまで、plpgsqlのpg_stat_activityに対するクエリをループしたいと思います。

答えて

7

PostgreSQLは、pg_stat_activitypg_stat_replicationの両方で使用されるpg_stat_get_activity()関数で使用されるデータのバックエンド(1接続あたり)をキャッシュします。

このキャッシュはコミット/ロールバック時にクリアされますが、トランザクション内の各ステートメントの末尾では通常のようにREAD COMMITTEDにはキャッシュされません。

SELECT pg_stat_clear_snapshot()で明示的に消去することができます。リフレッシュするにはPL/PgSQL LOOPの本文内で呼び出す。

AFAIKは、repeatable read以上の分離を使用すると、PostgreSQLに各文の後で自動リフレッシュを要求する方法がありません。

ソースコードでは、pgstat_read_current_status(void)pgstat_clear_snapshot(void)を参照してください。

+0

私のためのライフセーバー。ありがとう! – Otheus

関連する問題