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_lockspg_backend_pid(),PID

反馈

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