mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-08 03:16:57 +02:00
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)
|
||
|
|