mirror of
https://github.com/postgres/postgres.git
synced 2025-08-31 17:02:12 +03:00
Support synchronization of snapshots through an export/import procedure.
A transaction can export a snapshot with pg_export_snapshot(), and then others can import it with SET TRANSACTION SNAPSHOT. The data does not leave the server so there are not security issues. A snapshot can only be imported while the exporting transaction is still running, and there are some other restrictions. I'm not totally convinced that we've covered all the bases for SSI (true serializable) mode, but it works fine for lesser isolation modes. Joachim Wieland, reviewed by Marko Tiikkaja, and rather heavily modified by Tom Lane
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
SET TRANSACTION <replaceable class="parameter">transaction_mode</replaceable> [, ...]
|
||||
SET TRANSACTION SNAPSHOT <replaceable class="parameter">snapshot_id</replaceable>
|
||||
SET SESSION CHARACTERISTICS AS TRANSACTION <replaceable class="parameter">transaction_mode</replaceable> [, ...]
|
||||
|
||||
<phrase>where <replaceable class="parameter">transaction_mode</replaceable> is one of:</phrase>
|
||||
@@ -60,6 +61,8 @@ SET SESSION CHARACTERISTICS AS TRANSACTION <replaceable class="parameter">transa
|
||||
The available transaction characteristics are the transaction
|
||||
isolation level, the transaction access mode (read/write or
|
||||
read-only), and the deferrable mode.
|
||||
In addition, a snapshot can be selected, though only for the current
|
||||
transaction, not as a session default.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -98,7 +101,7 @@ SET SESSION CHARACTERISTICS AS TRANSACTION <replaceable class="parameter">transa
|
||||
serializable transactions would create a situation which could not
|
||||
have occurred for any serial (one-at-a-time) execution of those
|
||||
transactions, one of them will be rolled back with a
|
||||
<literal>serialization_failure</literal> <literal>SQLSTATE</literal>.
|
||||
<literal>serialization_failure</literal> error.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -139,13 +142,41 @@ SET SESSION CHARACTERISTICS AS TRANSACTION <replaceable class="parameter">transa
|
||||
<para>
|
||||
The <literal>DEFERRABLE</literal> transaction property has no effect
|
||||
unless the transaction is also <literal>SERIALIZABLE</literal> and
|
||||
<literal>READ ONLY</literal>. When all of these properties are set on a
|
||||
<literal>READ ONLY</literal>. When all three of these properties are
|
||||
selected for a
|
||||
transaction, the transaction may block when first acquiring its snapshot,
|
||||
after which it is able to run without the normal overhead of a
|
||||
<literal>SERIALIZABLE</literal> transaction and without any risk of
|
||||
contributing to or being canceled by a serialization failure. This mode
|
||||
is well suited for long-running reports or backups.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The <literal>SET TRANSACTION SNAPSHOT</literal> command allows a new
|
||||
transaction to run with the same <firstterm>snapshot</> as an existing
|
||||
transaction. The pre-existing transaction must have exported its snapshot
|
||||
with the <literal>pg_export_snapshot</literal> function (see <xref
|
||||
linkend="functions-snapshot-synchronization">). That function returns a
|
||||
snapshot identifier, which must be given to <literal>SET TRANSACTION
|
||||
SNAPSHOT</literal> to specify which snapshot is to be imported. The
|
||||
identifier must be written as a string literal in this command, for example
|
||||
<literal>'000003A1-1'</>.
|
||||
<literal>SET TRANSACTION SNAPSHOT</literal> can only be executed at the
|
||||
start of a transaction, before the first query or
|
||||
data-modification statement (<command>SELECT</command>,
|
||||
<command>INSERT</command>, <command>DELETE</command>,
|
||||
<command>UPDATE</command>, <command>FETCH</command>, or
|
||||
<command>COPY</command>) of the transaction. Furthermore, the transaction
|
||||
must already be set to <literal>SERIALIZABLE</literal> or
|
||||
<literal>REPEATABLE READ</literal> isolation level (otherwise, the snapshot
|
||||
would be discarded immediately, since <literal>READ COMMITTED</> mode takes
|
||||
a new snapshot for each command). If the importing transaction uses
|
||||
<literal>SERIALIZABLE</literal> isolation level, then the transaction that
|
||||
exported the snapshot must also use that isolation level. Also, a
|
||||
non-read-only serializable transaction cannot import a snapshot from a
|
||||
read-only transaction.
|
||||
</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
@@ -163,6 +194,8 @@ SET SESSION CHARACTERISTICS AS TRANSACTION <replaceable class="parameter">transa
|
||||
by instead specifying the desired <replaceable
|
||||
class="parameter">transaction_modes</replaceable> in
|
||||
<command>BEGIN</command> or <command>START TRANSACTION</command>.
|
||||
But that option is not available for <command>SET TRANSACTION
|
||||
SNAPSHOT</command>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -178,11 +211,45 @@ SET SESSION CHARACTERISTICS AS TRANSACTION <replaceable class="parameter">transa
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>
|
||||
To begin a new transaction with the same snapshot as an already
|
||||
existing transaction, first export the snapshot from the existing
|
||||
transaction. That will return the snapshot identifier, for example:
|
||||
|
||||
<programlisting>
|
||||
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
SELECT pg_export_snapshot();
|
||||
pg_export_snapshot
|
||||
--------------------
|
||||
000003A1-1
|
||||
(1 row)
|
||||
</programlisting>
|
||||
|
||||
Then give the snapshot identifier in a <command>SET TRANSACTION
|
||||
SNAPSHOT</command> command at the beginning of the newly opened
|
||||
transaction:
|
||||
|
||||
<programlisting>
|
||||
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
SET TRANSACTION SNAPSHOT '000003A1-1';
|
||||
</programlisting>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id="R1-SQL-SET-TRANSACTION-3">
|
||||
<title>Compatibility</title>
|
||||
|
||||
<para>
|
||||
Both commands are defined in the <acronym>SQL</acronym> standard.
|
||||
These commands are defined in the <acronym>SQL</acronym> standard,
|
||||
except for the <literal>DEFERRABLE</literal> transaction mode
|
||||
and the <command>SET TRANSACTION SNAPSHOT</> form, which are
|
||||
<productname>PostgreSQL</productname> extensions.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<literal>SERIALIZABLE</literal> is the default transaction
|
||||
isolation level in the standard. In
|
||||
<productname>PostgreSQL</productname> the default is ordinarily
|
||||
@@ -197,12 +264,6 @@ SET SESSION CHARACTERISTICS AS TRANSACTION <replaceable class="parameter">transa
|
||||
not implemented in the <productname>PostgreSQL</productname> server.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The <literal>DEFERRABLE</literal>
|
||||
<replaceable class="parameter">transaction_mode</replaceable>
|
||||
is a <productname>PostgreSQL</productname> language extension.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The SQL standard requires commas between successive <replaceable
|
||||
class="parameter">transaction_modes</replaceable>, but for historical
|
||||
|
Reference in New Issue
Block a user