PREPARE TRANSACTION — подготовка текущей транзакции к двухфазной фиксации
PREPARE TRANSACTION transaction_id
PREPARE TRANSACTION подготавливает текущую транзакцию
к двухфазной фиксации. После выполнения этой команды транзакция больше не связана с текущим сеансом; вместо этого её состояние полностью сохраняется на диске, и существует очень высокая вероятность того, что она может быть успешно зафиксирована, даже если произойдет сбой базы данных до запроса фиксации.
Подготовленную транзакцию можно зафиксировать или откатить позже
с помощью команд COMMIT PREPARED
или ROLLBACK PREPARED,
соответственно. Эти команды могут быть выполнены из любого сеанса, а не только из того, в котором была запущена исходная транзакция.
С точки зрения сеанса, выполняющего команду, PREPARE
TRANSACTION фактически не отличается от ROLLBACK команда: после её выполнения текущая транзакция перестаёт быть активной, а изменения, внесённые подготовленной транзакцией, становятся невидимыми. (Изменения снова станут видимыми в случае фиксации транзакции.)
Если PREPARE TRANSACTION команда завершается ошибкой по любой причине, она превращается в ROLLBACK: текущая транзакция отменяется.
transaction_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 по освобождению
места на диске, а в исключительных случаях может привести к остановке базы данных
для предотвращения зацикливания идентификаторов транзакций (см. Раздел 3.9.1.5). Также имейте в виду, что транзакция продолжает удерживать все установленные ею блокировки. Предполагаемое использование данной функции заключается в том, что подготовленная транзакция обычно фиксируется или откатывается, как только внешний менеджер транзакций подтвердит, что другие базы данных также готовы к фиксации.
Если вы не настроили внешний менеджер транзакций для отслеживания подготовленных транзакций и обеспечения их своевременного завершения, рекомендуется оставить функциональность подготовленных транзакций отключенной, установив max_prepared_transactions нулю. Это предотвратит случайное создание подготовленных транзакций, которые могут быть впоследствии забыты и в конечном итоге стать причиной проблем.
Подготовка текущей транзакции для двухфазной фиксации с использованием
foobar в качестве идентификатора транзакции:
PREPARE TRANSACTION 'foobar';
PREPARE TRANSACTION является
Digital Q.DataBase расширением. Команда предназначена для использования внешними системами управления транзакциями, некоторые из которых регулируются стандартами (например, X/Open XA), но интерфейс SQL для таких систем не стандартизирован.