1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
--
-- 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);
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
-- pg_advisory_unlock_all() shouldn't release xact locks
SELECT pg_advisory_unlock_all();
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory';
-- 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);
-- automatically release xact locks at commit
COMMIT;
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory';
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);
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
SELECT
pg_advisory_lock(1), pg_advisory_lock_shared(2),
pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2);
ROLLBACK;
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
-- 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);
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory';
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);
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
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);
ROLLBACK;
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
-- releasing all session locks
SELECT pg_advisory_unlock_all();
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory';
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);
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
COMMIT;
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory';
-- 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);
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
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);
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory';
-- .. 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);
SELECT locktype, classid, objid, objsubid, mode, granted
FROM pg_locks WHERE locktype = 'advisory'
ORDER BY classid, objid, objsubid;
SELECT pg_advisory_unlock_all();
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory';
|