pg_advisory_xact_lock_shared() 是一个用于获取共享事务级别 咨询锁 的系统函数。
pg_advisory_xact_lock_shared() 添加于 PostgreSQL 9.1。
用法
pg_advisory_xact_lock_shared (keybigint) →void
pg_advisory_xact_lock_shared (key1integer,key2integer) →void
pg_advisory_xact_lock_shared() 将无限期等待以获取指定的锁。要获取锁或在锁不可用时立即返回,请使用 pg_try_advisory_xact_lock_shared()。
获取的锁将在事务结束时释放。如果在事务之外执行,pg_advisory_xact_lock_shared() 将无效。
变更历史
- PostgreSQL 9.1
- 添加(提交 62c7bd31)
示例
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)
参考资料
- PostgreSQL 文档: 咨询锁函数
