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 文档: 咨询锁函数
