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>