182 lines
6.3 KiB
Plaintext
182 lines
6.3 KiB
Plaintext
<!--
|
|
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>
|