pg_stat_activity不会在过程或事务中更新

时间:2017-01-02 04:40:31

标签: postgresql plpgsql

我查询pg_stat_activity但是在我第一次在plpgsql函数体SERIALIZABLEREPEATABLE READ事务中查询内容后,内容似乎保持不变。

为什么pg_stat_activity不遵循plpgsql过程中READ COMMITTED的规则?

如何获取当前状态?我想在plpgsql中对pg_stat_activity的查询进行循环,直到在另一个后端运行的另一个查询完成。

1 个答案:

答案 0 :(得分:7)

PostgreSQL对pg_stat_get_activity()pg_stat_activity使用的pg_stat_replication函数使用的数据进行每个后端(每个连接,有效)缓存。

此缓存在提交/回滚时清除,但不会像往常一样在READ COMMITTED中的事务中的每个语句的末尾清除。

您可以使用SELECT pg_stat_clear_snapshot()明确清除它。在PL / PgSQL LOOP的主体内调用它来刷新。

使用repeatable read或更高隔离时,AFAIK无法让PostgreSQL在每个语句后自动刷新。

在源代码中,请参阅pgstat_read_current_status(void)pgstat_clear_snapshot(void)