pg_advisory_lock_shared()
是一个用于获取共享会话级 咨询锁 的系统函数。
pg_advisory_lock_shared()
添加于 PostgreSQL 8.2。
用法
pg_advisory_lock_shared (key
bigint
) →void
pg_advisory_lock_shared (key1
integer
,key2
integer
) →void
pg_advisory_lock_shared()
将会无限期等待以获取指定的锁。如果想在获取锁或者在锁不可用时立即返回,请使用 pg_try_advisory_lock_shared()
。
如果另一个会话持有共享会话级的咨询锁,则无法获取排他的会话级咨询锁。
变更历史
- PostgreSQL 8.2
- 添加于(提交 9b4cda0d)
示例
pg_advisory_lock_shared()
的基本用法示例
postgres=# SELECT pg_advisory_lock_shared(123); pg_advisory_lock_shared ------------------------- (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 | ShareLock | 3820555 | t | f (1 row)
可以从不同的会话获取另一个共享咨询锁
postgres=# SELECT pg_backend_pid(); pg_backend_pid ---------------- 3823496 (1 row) postgres=# SELECT pg_advisory_lock_shared(123); pg_advisory_lock_shared ------------------------- (1 row) 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 | ShareLock | 3823496 | t | f advisory | 5 | 123 | 1 | ShareLock | 3820555 | t | f (2 rows)
如果持有锁的会话结束(在此示例中为之前的会话),则锁将被释放(即不再存在)
postgres=# \c - foo You are now connected to database "postgres" as user "foo". 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 | ShareLock | 3820555 | t | f (1 row)
参考资料
- PostgreSQL 文档: 咨询锁函数