Working with Advisory Locks
1. Understanding Advisory Locks
| Property | Detail |
| Scope | Application-defined keys |
| Levels | Session or Transaction |
| Modes | Exclusive or Shared |
| Released by | Session end, explicit unlock, or TX commit |
2. Acquiring Session-Level Lock
SELECT pg_advisory_lock(42); -- blocks until acquired
3. Trying to Acquire Lock
SELECT pg_try_advisory_lock(42); -- returns true/false immediately
4. Releasing Session Lock
SELECT pg_advisory_unlock(42);
5. Using Transaction-Level Locks
BEGIN;
SELECT pg_advisory_xact_lock(42); -- auto-released on COMMIT/ROLLBACK
... ;
COMMIT;
6. Using Shared Advisory Locks
SELECT pg_advisory_lock_shared(42);
SELECT pg_try_advisory_xact_lock_shared(42);
7. Using Two-Integer Keys
SELECT pg_advisory_lock(1001, 42); -- namespace, key
8. Checking Lock Status
SELECT locktype, classid, objid, mode, granted
FROM pg_locks WHERE locktype = 'advisory';
9. Unlocking All Session Locks
SELECT pg_advisory_unlock_all();
10. Using Advisory Locks for Coordination
-- Singleton job runner
IF pg_try_advisory_lock(hashtext('cron:nightly')) THEN
PERFORM run_nightly();
PERFORM pg_advisory_unlock(hashtext('cron:nightly'));
END IF;
| Function | Mode / Scope |
| pg_advisory_lock | Exclusive / Session |
| pg_advisory_xact_lock | Exclusive / TX |
| pg_advisory_lock_shared | Shared / Session |
| pg_try_advisory_* | Non-blocking variants |