pg_terminate_backend不能循环工作

时间:2018-07-15 08:23:59

标签: postgresql loops

我做这样的事情

LOOP 
Exit when 1 = 2;
  SELECT pg_terminate_backend(procpid)
  FROM pg_stat_activity
   WHERE datname = 'wiki';
pg_sleep(10);
END LOOP;

但这仅是第一次。

下次选择上次处理并尝试终止它们(它们已终止)并抛出异常。

它不会停止,但不会终止新连接。

为什么找不到新的连接?

Tnx

1 个答案:

答案 0 :(得分:2)

pg_stat_activity(和所有其他pg_stat_xx视图)显示事务开始时间的快照。由于函数(包括do块)总是在事务中执行,因此循环不会看到任何更改。

您需要致电pg_stat_clear_snapshot()重置当前交易的统计快照,例如致电pg_sleep()之后。