Перейти к основному содержимому

PREPARE TRANSACTION

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

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

Примеры

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

PREPARE TRANSACTION 'foobar';

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

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

Смотрите также

COMMIT PREPARED, ROLLBACK PREPARED