pg_blocking_pids()

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

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

pg_blocking_pids() 添加于 PostgreSQL 9.6

用法

pg_blocking_pids ( integer ) → integer[]

输出是一个会话(后端)进程 ID 数组,这些进程 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_lockspg_backend_pid(),PID

反馈

提交任何关于 "pg_blocking_pids()" 的评论、建议或更正 在此处