Код: Выделить всё
demo=# BEGIN WORK;
BEGIN
demo=*# LOCK TABLE demo.test IN ACCESS EXCLUSIVE MODE;
LOCK TABLE
demo=*# PREPARE TRANSACTION 'abc';
PREPARE TRANSACTIONPREPARE TRANSACTION подготавливает текущую транзакцию для двухфазной фиксации. После этой команды транзакция перестаёт быть связанной с текущим сеансом; её состояние полностью сохраняется на диске, и есть очень большая вероятность, что она будет успешно зафиксирована, даже если до этого времени работа базы данных будет прервана аварийно.
Информацию о двухфазных транзакциях содержит представление pg_prepared_xacts:
Код: Выделить всё
demo=# select * from pg_prepared_xacts;
transaction | gid | prepared | owner | database | state3pc
-------------+-----+-------------------------------+----------+---------------+----------
344330 | abc | 2024-11-29 07:57:32.597673+03 | postgres | demo |
(1 row)-bash-4.4$ cd /var/lib/pgsql/pgdata/pg_twophase
-bash-4.4$ ls -l
total 4
-rw------- 1 postgres postgres 172 Nov 29 07:59 000000000005410A
Документация отслеживания блокировок pg_locks содержит SELECT с левым внешним соединением (LEFT JOIN) pg_locks и pg_prepared_xacts.
Отслеживать ресурсы, блокируемые двухфазнымми транзакциями, можно так:
Код: Выделить всё
demo=# SELECT po.locktype, po.relation::regclass, po.mode, ppx.* FROM pg_locks pl JOIN pg_prepared_xacts ppx on pl.transactionid = ppx.transa
ction join pg_locks po on pl.virtualtransaction = po.virtualtransaction;
locktype | relation | mode | transaction | gid | prepared | owner | database | state3pc
---------------+--------------------+---------------------+-------------+-----+-------------------------------+----------+---------------+----------
transactionid | | ExclusiveLock | 344330 | abc | 2024-11-29 07:57:32.597673+03 | postgres | demo |
relation | test_servers_jsonb | AccessExclusiveLock | 344330 | abc | 2024-11-29 07:57:32.597673+03 | postgres | demo |
(2 rows)