pg_blocking_pids()
是一个系统函数,返回阻止指定会话获取特定锁的会话列表。
pg_blocking_pids()
在 PostgreSQL 9.6 中添加。
用法
pg_blocking_pids (integer
) →integer
[]
输出是一个阻止指定会话的会话(后端)进程 ID 数组,如果没有任何阻止会话,则为一个空数组。
请注意以下注意事项
- 对于并行查询,列出执行查询的会话 PID,而不是并行工作器的 PID,这意味着可能存在重复的 PID
- 当准备好的事务持有冲突锁时,它将由 PID
0
表示
请注意,pg_blocking_pids()
的执行需要短暂独占访问锁管理器共享状态,这可能会对性能产生影响,尤其是在频繁调用时。
更改历史记录
- PostgreSQL 9.6
- 添加(提交 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 - 2016 年 7 月 Michael Paquier 的博客文章
另请参阅
pg_safe_snapshot_blocking_pids(),pg_locks,pg_backend_pid(),PID