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 - Michael Paquier 的 2016 年 7 月博客文章
另请参阅
pg_safe_snapshot_blocking_pids(), pg_locks, pg_backend_pid(), PID
