pg_advisory_lock()

用于获取独占会话级别的咨询锁的函数

pg_advisory_lock() 是一个用于获取独占会话级别的咨询锁的系统函数。

pg_advisory_lock()PostgreSQL 8.2 中被添加。

用法

pg_advisory_lock ( key bigint ) → void
pg_advisory_lock ( key1 integer, key2 integer ) → void

pg_advisory_lock() 将无限期地等待以获取指定的锁。要获取锁,或者在锁不可用时立即返回,请使用 pg_try_advisory_lock()

一旦获取到锁,它将在当前会话结束时,或者在执行 pg_advisory_unlock()pg_advisory_unlock_all() 后被释放。

变更历史

示例

pg_advisory_lock() 的基本用法示例

postgres=# SELECT pg_advisory_lock(123);
 pg_advisory_lock
------------------

(1 row)

此时将在 pg_locks 中有一个对应的条目

postgres=# SELECT locktype, database, objid, objsubid, mode, pid, granted, fastpath
             FROM pg_locks
            WHERE locktype = 'advisory';
 locktype | database | objid | objsubid |     mode      |   pid   | granted | fastpath
----------+----------+-------+----------+---------------+---------+---------+----------
 advisory |        5 |   123 |        1 | ExclusiveLock | 3787025 | t       | f
(1 row)

从另一个会话尝试获取相同的锁会导致 pg_advisory_lock() 无限期地挂起

postgres=# SELECT pg_backend_pid();
 pg_backend_pid 
----------------
        3787428
(1 row)

Time: 0.367 ms

postgres=# SELECT pg_advisory_lock(123);
^CCancel request sent
ERROR:  canceling statement due to user request
Time: 5385.386 ms (00:05.385)

如果持有锁的会话结束(在此示例中为第一个会话),则锁会被释放(即不再存在)

postgres=# \c - foo
You are now connected to database "postgres" as user "foo".
postgres=> SELECT pg_backend_pid();
 pg_backend_pid
----------------
        3787025
(1 row)

postgres=>  SELECT locktype, database, objid, objsubid, mode, granted, fastpath
             FROM pg_locks
            WHERE locktype = 'advisory';
 locktype | database | objid | objsubid | mode | granted | fastpath
----------+----------+-------+----------+------+---------+----------
(0 rows)

分类

锁定, 系统函数

另请参阅

pg_try_advisory_lock(), pg_advisory_unlock(), pg_advisory_unlock_all(), 咨询锁

反馈

请在此提交关于“pg_advisory_lock()”的任何评论、建议或更正 here