PostgreSQL pg_blocking_pids() 函数使用指南

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

pg_blocking_pids() 语法

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

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:

    SELECT pg_backend_pid();
    
    pg_backend_pid
    ----------------
              1152

    启动事务

    BEGIN;
    

    锁定 student 表:

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

    SELECT pg_backend_pid();
    
    pg_backend_pid
    ----------------
              18376

    启动事务:

    BEGIN;
    

    student 表插入一个新行:

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

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

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

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

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