pg_blocking_pids()
是一个系统函数,返回阻止指定会话获取特定锁的会话列表。
pg_blocking_pids()
添加于 PostgreSQL 9.6。
用法
pg_blocking_pids (integer
) →integer
[]
输出是一个会话(后端)进程 ID 数组,这些进程 ID 阻止了指定的会话,如果没有阻止会话,则为空数组。
请注意以下注意事项:
- 对于并行查询,列出的是执行查询的会话 PID,而不是并行工作程序的 PID,这意味着可能存在重复的 PID。
- 当已准备的事务持有冲突锁时,它将由 PID
0
表示。
请注意,pg_blocking_pids()
的执行需要短暂地独占访问锁管理器共享状态,这可能会影响性能,尤其是在频繁调用时。
变更历史
- PostgreSQL 9.6
- 添加 (commit 52f5d578)
示例
假设以下表在一个会话中被锁定,例如:
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)
参考文献
- PostgreSQL 文档: 会话信息函数
有用链接
- Postgres 9.6 功能亮点 - pg_blocking_pids - Michael Paquier 于 2016 年 7 月撰写的博客文章
参见
pg_safe_snapshot_blocking_pids(),pg_locks,pg_backend_pid(),PID