Working with Advisory Locks

1. Understanding Advisory Locks

PropertyDetail
ScopeApplication-defined keys
LevelsSession or Transaction
ModesExclusive or Shared
Released bySession 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;
FunctionMode / Scope
pg_advisory_lockExclusive / Session
pg_advisory_xact_lockExclusive / TX
pg_advisory_lock_sharedShared / Session
pg_try_advisory_*Non-blocking variants