Skip to content

PostgreSQL pg_blocking_pids() 函数 ​

PostgreSQL pg_blocking_pids() 函数返回阻止指定的会话获取锁的会话的进程 ID 列表。

pg_blocking_pids() 语法 ​

这里是 PostgreSQL pg_blocking_pids() 函数的语法:

sql
pg_blocking_pids(pid integer) -> integer[]

参数 ​

  • pid

    被阻止的会话的进程 ID。

返回值 ​

PostgreSQL pg_blocking_pids() 函数返回一个数组,它包含所有的阻止指定的会话获取锁的会话的进程 ID。

pg_blocking_pids() 示例 ​

演示 pg_blocking_pids() 的用法需要 3 个会话,请按照如下步骤进行本示例。

  1. 打开一个会话并登录,使用 pg_backend_pid() 函数查看当前会话的进程 ID:

    sql
    SELECT pg_backend_pid();
    bash
    pg_backend_pid
    ----------------
              1152

    启动事务

    sql
    BEGIN;

    锁定 student 表:

    sql
    LOCK TABLE student IN ACCESS EXCLUSIVE MODE;
  2. 重新打开一个新会话并登录,使用 pg_backend_pid() 函数查看当前会话的进程 ID:

    sql
    SELECT pg_backend_pid();
    bash
    pg_backend_pid
    ----------------
              18376

    启动事务:

    sql
    BEGIN;

    向 student 表插入一个新行:

    sql
    INSERT INTO student (name, gender) VALUES ('Tim', 'M');

    你会发现,这个执行被阻止了,一直没有返回。

  3. 重新打开一个新会话并登录,使用 pg_blocking_pids() 函数查看那些阻止了第二个会话(18376)的会话:

    sql
    SELECT pg_blocking_pids(18376);
    bash
    pg_blocking_pids
    ------------------
    {1152}

    1152 是第一个会话的进程 ID。这说明第一个会话阻止了第二个会话。