| <!-- |
| doc/src/sgml/ref/prepare_transaction.sgml |
| PostgreSQL documentation |
| --> |
| |
| <refentry id="sql-prepare-transaction"> |
| <indexterm zone="sql-prepare-transaction"> |
| <primary>PREPARE TRANSACTION</primary> |
| </indexterm> |
| |
| <refmeta> |
| <refentrytitle>PREPARE TRANSACTION</refentrytitle> |
| <manvolnum>7</manvolnum> |
| <refmiscinfo>SQL - Language Statements</refmiscinfo> |
| </refmeta> |
| |
| <refnamediv> |
| <refname>PREPARE TRANSACTION</refname> |
| <refpurpose>prepare the current transaction for two-phase commit</refpurpose> |
| </refnamediv> |
| |
| <refsynopsisdiv> |
| <synopsis> |
| PREPARE TRANSACTION <replaceable class="parameter">transaction_id</replaceable> |
| </synopsis> |
| </refsynopsisdiv> |
| |
| <refsect1> |
| <title>Description</title> |
| |
| <para> |
| <command>PREPARE TRANSACTION</command> prepares the current transaction |
| for two-phase commit. After this command, the transaction is no longer |
| associated with the current session; instead, its state is fully stored on |
| disk, and there is a very high probability that it can be committed |
| successfully, even if a database crash occurs before the commit is |
| requested. |
| </para> |
| |
| <para> |
| Once prepared, a transaction can later be committed or rolled back |
| with <link linkend="sql-commit-prepared"><command>COMMIT PREPARED</command></link> |
| or <link linkend="sql-rollback-prepared"><command>ROLLBACK PREPARED</command></link>, |
| respectively. Those commands can be issued from any session, not |
| only the one that executed the original transaction. |
| </para> |
| |
| <para> |
| From the point of view of the issuing session, <command>PREPARE |
| TRANSACTION</command> is not unlike a <command>ROLLBACK</command> command: |
| after executing it, there is no active current transaction, and the |
| effects of the prepared transaction are no longer visible. (The effects |
| will become visible again if the transaction is committed.) |
| </para> |
| |
| <para> |
| If the <command>PREPARE TRANSACTION</command> command fails for any |
| reason, it becomes a <command>ROLLBACK</command>: the current transaction |
| is canceled. |
| </para> |
| </refsect1> |
| |
| <refsect1> |
| <title>Parameters</title> |
| |
| <variablelist> |
| <varlistentry> |
| <term><replaceable class="parameter">transaction_id</replaceable></term> |
| <listitem> |
| <para> |
| An arbitrary identifier that later identifies this transaction for |
| <command>COMMIT PREPARED</command> or <command>ROLLBACK PREPARED</command>. |
| The identifier must be written as a string literal, and must be |
| less than 200 bytes long. It must not be the same as the identifier |
| used for any currently prepared transaction. |
| </para> |
| </listitem> |
| </varlistentry> |
| </variablelist> |
| </refsect1> |
| |
| <refsect1> |
| <title>Notes</title> |
| |
| <para> |
| <command>PREPARE TRANSACTION</command> is not intended for use in applications |
| or interactive sessions. Its purpose is to allow an external |
| transaction manager to perform atomic global transactions across multiple |
| databases or other transactional resources. Unless you're writing a |
| transaction manager, you probably shouldn't be using <command>PREPARE |
| TRANSACTION</command>. |
| </para> |
| |
| <para> |
| This command must be used inside a transaction block. Use <link |
| linkend="sql-begin"><command>BEGIN</command></link> to start one. |
| </para> |
| |
| <para> |
| It is not currently allowed to <command>PREPARE</command> a transaction that |
| has executed any operations involving temporary tables or the session's |
| temporary namespace, created any cursors <literal>WITH HOLD</literal>, or |
| executed <command>LISTEN</command>, <command>UNLISTEN</command>, or |
| <command>NOTIFY</command>. |
| Those features are too tightly |
| tied to the current session to be useful in a transaction to be prepared. |
| </para> |
| |
| <para> |
| If the transaction modified any run-time parameters with <command>SET</command> |
| (without the <literal>LOCAL</literal> option), |
| those effects persist after <command>PREPARE TRANSACTION</command>, and will not |
| be affected by any later <command>COMMIT PREPARED</command> or |
| <command>ROLLBACK PREPARED</command>. Thus, in this one respect |
| <command>PREPARE TRANSACTION</command> acts more like <command>COMMIT</command> than |
| <command>ROLLBACK</command>. |
| </para> |
| |
| <para> |
| All currently available prepared transactions are listed in the |
| <link linkend="view-pg-prepared-xacts"><structname>pg_prepared_xacts</structname></link> |
| system view. |
| </para> |
| |
| <caution> |
| <para> |
| It is unwise to leave transactions in the prepared state for a long time. |
| This will interfere with the ability of <command>VACUUM</command> to reclaim |
| storage, and in extreme cases could cause the database to shut down |
| to prevent transaction ID wraparound (see <xref |
| linkend="vacuum-for-wraparound"/>). Keep in mind also that the transaction |
| continues to hold whatever locks it held. The intended usage of the |
| feature is that a prepared transaction will normally be committed or |
| rolled back as soon as an external transaction manager has verified that |
| other databases are also prepared to commit. |
| </para> |
| |
| <para> |
| If you have not set up an external transaction manager to track prepared |
| transactions and ensure they get closed out promptly, it is best to keep |
| the prepared-transaction feature disabled by setting |
| <xref linkend="guc-max-prepared-transactions"/> to zero. This will |
| prevent accidental creation of prepared transactions that might then |
| be forgotten and eventually cause problems. |
| </para> |
| </caution> |
| </refsect1> |
| |
| <refsect1 id="sql-prepare-transaction-examples"> |
| <title>Examples</title> |
| <para> |
| Prepare the current transaction for two-phase commit, using |
| <literal>foobar</literal> as the transaction identifier: |
| |
| <programlisting> |
| PREPARE TRANSACTION 'foobar'; |
| </programlisting></para> |
| </refsect1> |
| |
| <refsect1> |
| <title>Compatibility</title> |
| |
| <para> |
| <command>PREPARE TRANSACTION</command> is a |
| <productname>PostgreSQL</productname> extension. It is intended for use by |
| external transaction management systems, some of which are covered by |
| standards (such as X/Open XA), but the SQL side of those systems is not |
| standardized. |
| </para> |
| </refsect1> |
| |
| <refsect1> |
| <title>See Also</title> |
| |
| <simplelist type="inline"> |
| <member><xref linkend="sql-commit-prepared"/></member> |
| <member><xref linkend="sql-rollback-prepared"/></member> |
| </simplelist> |
| </refsect1> |
| |
| </refentry> |