pg_blocking_pids()

一个列出阻止某个会话获取锁的会话的函数

pg_blocking_pids() 是一个系统函数,返回一个列表,其中包含阻止指定会话获取特定锁的会话。

pg_blocking_pids() 函数于 PostgreSQL 9.6 中添加。

用法

pg_blocking_pids ( integer ) → integer[]

该函数返回一个包含阻止指定会话的会话(后台进程)进程 ID 的数组,如果没有阻止会话,则返回一个空数组。

请注意以下几点:

  • 对于并行查询,列出的是执行查询的会话 PID,而不是并行工作进程的 PID,因此可能存在重复的 PID。
  • 当一个预备事务持有冲突锁时,它将由 PID 0 表示。

请注意,执行 pg_blocking_pids() 需要在短时间内独占访问锁管理器共享状态,这可能会对性能产生影响,尤其是在频繁调用时。

变更历史

示例

假设在一个会话中锁定了以下表,例如:

postgres=# BEGIN;
BEGIN

postgres=*# LOCK TABLE foo IN ACCESS EXCLUSIVE MODE;
LOCK TABLE

另一个会话正在尝试修改该表,例如:

postgres=# SELECT pg_backend_pid();
 pg_backend_pid 
----------------
        4154357
(1 row)

postgres=# BEGIN;
BEGIN

postgres=*# INSERT INTO foo VALUES(1);

如下查询将列出被阻塞会话的详细信息:

postgres=# SELECT pid, pg_blocking_pids(pid), query
             FROM pg_stat_activity
            WHERE backend_type = 'client backend'
              AND wait_event_type = 'Lock';
   pid   | pg_blocking_pids |           query            
---------+------------------+----------------------------
 4154357 | {4154298}        | INSERT INTO foo VALUES(1);
(1 row)

当没有阻塞会话时的 pg_blocking_pids() 输出

postgres=# SELECT * FROM pg_blocking_pids(pg_backend_pid());
 pg_blocking_pids
------------------
 {}
(1 row)

分类

锁定, 系统函数

另请参阅

pg_safe_snapshot_blocking_pids(), pg_locks, pg_backend_pid(), PID

反馈

提交有关“pg_blocking_pids()”的任何评论、建议或更正请移步 这里