PREPARE TRANSACTION
PREPARE TRANSACTION — подготовить текущую транзакцию для двухфазной фиксации
Синтаксис
PREPARE TRANSACTION id_транзакции
Описание
PREPARE TRANSACTION
подготавливает текущую транзакцию для двухфазной фиксации. После этой команды транзакция перестаёт быть связанной с текущим сеансом; её состояние полностью сохраняется на диске, и есть очень большая вероятность, что она будет успешно зафиксирована, даже если до этого времени работа базы данных будет прервана аварийно.
Подготовленную транзакцию затем можно зафиксировать или отменить командами COMMIT PREPARED
и ROLLBACK PREPARED
, соответственно. Эти команды можно вызывать из любого сеанса, не только из того, в котором эта транзакция создавалась.
С точки зрения сеанса, выполняющего команду, PREPARE TRANSACTION
не отличается от ROLLBACK
: после её выполнения не активна никакая транзакция, а результат действия подготовленной транзакции становится невидимым (Он окажется видимым снова, если транзакция будет зафиксирована.)
Если при выполнении команды PREPARE TRANSACTION
по какой-то причине происходит сбой, команда действует как ROLLBACK
: текущая транзакция откатывается.
Параметры
id_транзакции
Произвольный идентификатор, по которому затем на эту транзакцию будут ссылаться команды
COMMIT PREPARED
илиROLLBACK PREPARED
. Идентификатор должен задаваться строковой константой не длиннее 200 байт и должен отличаться от идентификаторов любых других подготовленных на данный момент транзакций.
Примечания
PREPARE TRANSACTION
не предназначена для использования в приложениях или интерактивных сеансах. Её задача — дать возможность внешнему менеджеру транзакций выполнять атомарные глобальные транзакции, охватывающие несколько баз данных или другие транзакционные ресурсы. Обычно применять PREPARE TRANSACTION
следует только при разработке собственного менеджера транзакций.
Эта команда должна выполняться внутри блока транзакции. Начинает блок транзакции команда BEGIN
.
В настоящее время команда PREPARE
неспособна подготавливать транзакции, в которых выполнялись какие-либо действия с временными таблицами или во временном пространстве имён сеанса, создавались курсоры WITH HOLD
либо выполнялись команды LISTEN
, UNLISTEN
или NOTIFY
. Эти функции слишком тесно связаны с текущим сеансом, так что в подготовленной транзакции они не были бы полезны.
Если транзакция меняет какие-либо параметры времени выполнения командой SET
(без указания LOCAL
), их значения сохраняются после PREPARE TRANSACTION
и не зависят от последующих команд COMMIT PREPARED
и ROLLBACK PREPARED
. Так что в этом отношении PREPARE TRANSACTION
больше похожа на COMMIT
, чем на ROLLBACK
.
Все существующие в текущий момент подготовленные транзакции показываются в системном представлении pg_prepared_xacts
.
Внимание
Оставлять транзакции в подготовленном состоянии на долгое время не рекомендуется. Это повлияет на способность команды VACUUM
высвобождать пространство, а в крайнем случае может привести к отключению базы данных для предотвращения зацикливания ID транзакций (см. Подраздел 25.1.5). Также учтите, что транзакция продолжит удерживать все свои блокировки. Это сделано с расчётом на то, что подготовленная транзакция будет зафиксирована или отменена как только внешний менеджер транзакций убедится, что все другие базы данных так же готовы к фиксации.
В отсутствие настроенного внешнего менеджера транзакций, который бы отслеживал подготовленные транзакции и своевременно закрывал их, лучше вовсе отключить поддержку подготовленных транзакций, установив max_prepared_transactions равным нулю. Это не позволит случайно создать подготовленные транзакции, которые могут быть забыты и в конце концов станут причиной проблем.
Примеры
Текущая транзакция подготавливается для двухфазной фиксации, при этом ей назначается идентификатор foobar
:
PREPARE TRANSACTION 'foobar';
Совместимость
Оператор PREPARE TRANSACTION
является расширением PostgreSQL. Он предназначен для использования внешними системами управления транзакциями, некоторые из которых работают по стандартам (например, X/Open XA), но сторона SQL в этих системах не стандартизирована.