mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-02 19:26:51 +02:00
62c7bd31c8
They share the same locking namespace with the existing session-level advisory locks, but they are automatically released at the end of the current transaction and cannot be released explicitly via unlock functions. Marko Tiikkaja, reviewed by me.
276 lines
12 KiB
Plaintext
276 lines
12 KiB
Plaintext
--
|
|
-- ADVISORY LOCKS
|
|
--
|
|
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'
|
|
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';
|
|
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';
|
|
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'
|
|
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'
|
|
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';
|
|
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'
|
|
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'
|
|
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';
|
|
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'
|
|
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';
|
|
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'
|
|
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';
|
|
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'
|
|
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';
|
|
count
|
|
-------
|
|
0
|
|
(1 row)
|
|
|