pg_advisory_xact_lock_shared()

用于获取共享事务级别咨询锁的函数

pg_advisory_xact_lock_shared() 是一个用于获取共享事务级别 咨询锁 的系统函数。

pg_advisory_xact_lock_shared() 添加于 PostgreSQL 9.1

用法

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

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

获取的锁将在事务结束时释放。如果在事务之外执行,pg_advisory_xact_lock_shared() 将无效。

变更历史

示例

pg_advisory_xact_lock_shared() 的基本用法示例

postgres=# BEGIN;
BEGIN
postgres=*# SELECT pg_try_advisory_xact_lock_shared(123);
 pg_try_advisory_xact_lock_shared
----------------------------------
 t
(1 row)

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

postgres=*# SELECT locktype, database, objid, objsubid, virtualtransaction, mode, pid, granted, fastpath
              FROM pg_locks
             WHERE locktype = 'advisory';
 locktype | database | objid | objsubid | virtualtransaction |   mode    |   pid   | granted | fastpath
----------+----------+-------+----------+--------------------+-----------+---------+---------+----------
 advisory |        5 |   123 |        1 | 34/7               | ShareLock | 3920448 | t       | f
(1 row)

可以从不同会话的事务中获取另一个共享咨询锁

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

postgres=# BEGIN;
BEGIN
postgres=*# SELECT pg_try_advisory_xact_lock_shared(123);
 pg_try_advisory_xact_lock_shared 
----------------------------------
 t
(1 row)

postgres=*# SELECT locktype, database, objid, objsubid, virtualtransaction, mode, pid, granted, fastpath
              FROM pg_locks
             WHERE locktype = 'advisory';
 locktype | database | objid | objsubid | virtualtransaction |   mode    |   pid   | granted | fastpath 
----------+----------+-------+----------+--------------------+-----------+---------+---------+----------
 advisory |        5 |   123 |        1 | 35/3               | ShareLock | 3921931 | t       | f
 advisory |        5 |   123 |        1 | 34/7               | ShareLock | 3920448 | t       | f
(2 rows)

如果持有锁的事务结束(在此示例中为之前的事务),则锁将被释放(即不再存在)

postgres=*# SELECT pg_backend_pid();
 pg_backend_pid 
----------------
        3921931
(1 row)

postgres=*# ROLLBACK;
ROLLBACK

postgres=# SELECT locktype, database, objid, objsubid, virtualtransaction, mode, pid, granted, fastpath
             FROM pg_locks
            WHERE locktype = 'advisory';
 locktype | database | objid | objsubid | virtualtransaction |   mode    |   pid   | granted | fastpath 
----------+----------+-------+----------+--------------------+-----------+---------+---------+----------
 advisory |        5 |   123 |        1 | 34/7               | ShareLock | 3920448 | t       | f
(1 row)

分类

锁定, 系统函数

另请参阅

pg_try_advisory_xact_lock_shared(), pg_advisory_xact_lock(), 咨询锁

反馈

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