pg_advisory_unlock_all()
是一个系统函数,用于释放当前会话持有的所有会话级别的 advisory locks。
pg_advisory_unlock_all()
在 PostgreSQL 8.2 中被添加。
用法
pg_advisory_unlock_all () → void
pg_advisory_unlock_all()
会释放会话持有的所有会话级别的共享和排他锁。要释放单个共享锁,请使用 pg_advisory_unlock_shared()
,要释放单个排他锁,请使用 pg_advisory_unlock()
。
请注意,pg_advisory_unlock_all()
不会提供任何关于实际释放了哪些锁(如果有的话)的反馈,即使当前会话不持有任何会话级别的锁,它也可以成功执行。
变更历史
- PostgreSQL 8.2
- 添加于(提交 9b4cda0d)
示例
的基本用法示例pg_advisory_unlock_all()
postgres=# SELECT pg_advisory_lock(123); pg_advisory_lock ------------------ (1 row) postgres=# SELECT pg_advisory_lock(456); pg_advisory_lock ------------------ (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 | 456 | 1 | ExclusiveLock | 3795641 | t | f advisory | 5 | 123 | 1 | ExclusiveLock | 3795641 | t | f (2 rows) postgres=# SELECT pg_advisory_unlock_all(); pg_advisory_unlock_all ------------------------ (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 ----------+----------+-------+----------+------+-----+---------+---------- (0 rows)
如果当前会话不持有任何会话级别的锁,pg_advisory_unlock_all()
将不起作用,也不会影响其他会话持有的锁。
postgres=# SELECT pg_backend_pid(); pg_backend_pid ---------------- 3796065 (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 | 456 | 1 | ExclusiveLock | 3795641 | t | f advisory | 5 | 123 | 1 | ExclusiveLock | 3795641 | t | f (2 rows) postgres=# SELECT pg_advisory_unlock_all(); pg_advisory_unlock_all ------------------------ (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 | 456 | 1 | ExclusiveLock | 3795641 | t | f advisory | 5 | 123 | 1 | ExclusiveLock | 3795641 | t | f (2 rows)
参考资料
- PostgreSQL 文档: 咨询锁函数