| -- |
| -- ADVISORY LOCKS |
| -- |
| SELECT oid AS datoid FROM pg_database WHERE datname = current_database() \gset |
| BEGIN; |
| SELECT |
| pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), |
| pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); |
| pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock_shared |
| -----------------------+------------------------------+-----------------------+------------------------------ |
| | | | |
| (1 row) |
| |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| -- pg_advisory_unlock_all() shouldn't release xact locks |
| SELECT pg_advisory_unlock_all(); |
| pg_advisory_unlock_all |
| ------------------------ |
| |
| (1 row) |
| |
| SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid; |
| count |
| ------- |
| 4 |
| (1 row) |
| |
| -- can't unlock xact locks |
| SELECT |
| pg_advisory_unlock(1), pg_advisory_unlock_shared(2), |
| pg_advisory_unlock(1, 1), pg_advisory_unlock_shared(2, 2); |
| WARNING: you don't own a lock of type ExclusiveLock |
| WARNING: you don't own a lock of type ShareLock |
| WARNING: you don't own a lock of type ExclusiveLock |
| WARNING: you don't own a lock of type ShareLock |
| pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock | pg_advisory_unlock_shared |
| --------------------+---------------------------+--------------------+--------------------------- |
| f | f | f | f |
| (1 row) |
| |
| -- automatically release xact locks at commit |
| COMMIT; |
| SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid; |
| count |
| ------- |
| 0 |
| (1 row) |
| |
| BEGIN; |
| -- holding both session and xact locks on the same objects, xact first |
| SELECT |
| pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), |
| pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); |
| pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock_shared |
| -----------------------+------------------------------+-----------------------+------------------------------ |
| | | | |
| (1 row) |
| |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| SELECT |
| pg_advisory_lock(1), pg_advisory_lock_shared(2), |
| pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2); |
| pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock_shared |
| ------------------+-------------------------+------------------+------------------------- |
| | | | |
| (1 row) |
| |
| ROLLBACK; |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| -- unlocking session locks |
| SELECT |
| pg_advisory_unlock(1), pg_advisory_unlock(1), |
| pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2), |
| pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1), |
| pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2); |
| WARNING: you don't own a lock of type ExclusiveLock |
| WARNING: you don't own a lock of type ShareLock |
| WARNING: you don't own a lock of type ExclusiveLock |
| WARNING: you don't own a lock of type ShareLock |
| pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared | pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared |
| --------------------+--------------------+---------------------------+---------------------------+--------------------+--------------------+---------------------------+--------------------------- |
| t | f | t | f | t | f | t | f |
| (1 row) |
| |
| SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid; |
| count |
| ------- |
| 0 |
| (1 row) |
| |
| BEGIN; |
| -- holding both session and xact locks on the same objects, session first |
| SELECT |
| pg_advisory_lock(1), pg_advisory_lock_shared(2), |
| pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2); |
| pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock_shared |
| ------------------+-------------------------+------------------+------------------------- |
| | | | |
| (1 row) |
| |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| SELECT |
| pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2), |
| pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2); |
| pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock_shared |
| -----------------------+------------------------------+-----------------------+------------------------------ |
| | | | |
| (1 row) |
| |
| ROLLBACK; |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| -- releasing all session locks |
| SELECT pg_advisory_unlock_all(); |
| pg_advisory_unlock_all |
| ------------------------ |
| |
| (1 row) |
| |
| SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid; |
| count |
| ------- |
| 0 |
| (1 row) |
| |
| BEGIN; |
| -- grabbing txn locks multiple times |
| SELECT |
| pg_advisory_xact_lock(1), pg_advisory_xact_lock(1), |
| pg_advisory_xact_lock_shared(2), pg_advisory_xact_lock_shared(2), |
| pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock(1, 1), |
| pg_advisory_xact_lock_shared(2, 2), pg_advisory_xact_lock_shared(2, 2); |
| pg_advisory_xact_lock | pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock_shared | pg_advisory_xact_lock | pg_advisory_xact_lock | pg_advisory_xact_lock_shared | pg_advisory_xact_lock_shared |
| -----------------------+-----------------------+------------------------------+------------------------------+-----------------------+-----------------------+------------------------------+------------------------------ |
| | | | | | | | |
| (1 row) |
| |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| COMMIT; |
| SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid; |
| count |
| ------- |
| 0 |
| (1 row) |
| |
| -- grabbing session locks multiple times |
| SELECT |
| pg_advisory_lock(1), pg_advisory_lock(1), |
| pg_advisory_lock_shared(2), pg_advisory_lock_shared(2), |
| pg_advisory_lock(1, 1), pg_advisory_lock(1, 1), |
| pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2); |
| pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared |
| ------------------+------------------+-------------------------+-------------------------+------------------+------------------+-------------------------+------------------------- |
| | | | | | | | |
| (1 row) |
| |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| SELECT |
| pg_advisory_unlock(1), pg_advisory_unlock(1), |
| pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2), |
| pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1), |
| pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2); |
| pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared | pg_advisory_unlock | pg_advisory_unlock | pg_advisory_unlock_shared | pg_advisory_unlock_shared |
| --------------------+--------------------+---------------------------+---------------------------+--------------------+--------------------+---------------------------+--------------------------- |
| t | t | t | t | t | t | t | t |
| (1 row) |
| |
| SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid; |
| count |
| ------- |
| 0 |
| (1 row) |
| |
| -- .. and releasing them all at once |
| SELECT |
| pg_advisory_lock(1), pg_advisory_lock(1), |
| pg_advisory_lock_shared(2), pg_advisory_lock_shared(2), |
| pg_advisory_lock(1, 1), pg_advisory_lock(1, 1), |
| pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2); |
| pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared | pg_advisory_lock | pg_advisory_lock | pg_advisory_lock_shared | pg_advisory_lock_shared |
| ------------------+------------------+-------------------------+-------------------------+------------------+------------------+-------------------------+------------------------- |
| | | | | | | | |
| (1 row) |
| |
| SELECT locktype, classid, objid, objsubid, mode, granted |
| FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid |
| ORDER BY classid, objid, objsubid; |
| locktype | classid | objid | objsubid | mode | granted |
| ----------+---------+-------+----------+---------------+--------- |
| advisory | 0 | 1 | 1 | ExclusiveLock | t |
| advisory | 0 | 2 | 1 | ShareLock | t |
| advisory | 1 | 1 | 2 | ExclusiveLock | t |
| advisory | 2 | 2 | 2 | ShareLock | t |
| (4 rows) |
| |
| SELECT pg_advisory_unlock_all(); |
| pg_advisory_unlock_all |
| ------------------------ |
| |
| (1 row) |
| |
| SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid; |
| count |
| ------- |
| 0 |
| (1 row) |
| |