mirror of
https://github.com/postgres/postgres.git
synced 2026-01-05 23:38:41 +03:00
Otherwise testing an existing installation can fail, if there are other locks, e.g. from one of the isolation tests. Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/20221003234111.4ob7yph6r4g4ywhu@awork3.anarazel.de
149 lines
4.4 KiB
PL/PgSQL
149 lines
4.4 KiB
PL/PgSQL
--
|
|
-- 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);
|
|
|
|
SELECT locktype, classid, objid, objsubid, mode, granted
|
|
FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid
|
|
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' AND database = :datoid;
|
|
|
|
|
|
-- 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' AND database = :datoid;
|
|
|
|
|
|
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' AND database = :datoid
|
|
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' AND database = :datoid
|
|
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' AND database = :datoid;
|
|
|
|
|
|
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' AND database = :datoid
|
|
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' AND database = :datoid
|
|
ORDER BY classid, objid, objsubid;
|
|
|
|
|
|
-- releasing all session locks
|
|
SELECT pg_advisory_unlock_all();
|
|
|
|
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid;
|
|
|
|
|
|
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' AND database = :datoid
|
|
ORDER BY classid, objid, objsubid;
|
|
|
|
COMMIT;
|
|
|
|
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid;
|
|
|
|
-- 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' AND database = :datoid
|
|
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 database = :datoid;
|
|
|
|
-- .. 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' AND database = :datoid
|
|
ORDER BY classid, objid, objsubid;
|
|
|
|
SELECT pg_advisory_unlock_all();
|
|
|
|
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = :datoid;
|