PREPARE TRANSACTION#

PREPARE TRANSACTION

PREPARE TRANSACTION

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 освободить место, и в экстремальных случаях может привести к остановке базы данных для предотвращения зацикливания идентификаторов транзакций (см. Раздел 23.1.5). Также имейте в виду, что транзакция продолжает удерживать все предыдущие блокировки. Предполагается, что подготовленная транзакция будет обычно подтверждена или откатана, как только внешний менеджер транзакций проверит, что другие базы данных также готовы к коммиту.

Если вы не настроили внешний менеджер транзакций для отслеживания подготовленных транзакций и обеспечения их своевременного закрытия, лучше отключить функцию подготовленных транзакций, установив значение max_prepared_transactions равным нулю. Это предотвратит случайное создание подготовленных транзакций, которые могут быть забыты и в конечном итоге вызвать проблемы.

Примеры

Подготовьте текущую транзакцию для двухфазного коммита, используя foobar в качестве идентификатора транзакции:

PREPARE TRANSACTION 'foobar';

Совместимость

PREPARE TRANSACTION - это расширение Tantor BE. Оно предназначено для использования внешними системами управления транзакциями, некоторые из которых покрываются стандартами (например, X/Open XA), но SQL-часть этих систем не является стандартизированной.