summaryrefslogtreecommitdiffstats
path: root/doc/src/sgml/xact.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/xact.sgml')
-rw-r--r--doc/src/sgml/xact.sgml205
1 files changed, 205 insertions, 0 deletions
diff --git a/doc/src/sgml/xact.sgml b/doc/src/sgml/xact.sgml
new file mode 100644
index 0000000..a707cc5
--- /dev/null
+++ b/doc/src/sgml/xact.sgml
@@ -0,0 +1,205 @@
+<!-- doc/src/sgml/xact.sgml -->
+
+<chapter id="transactions">
+
+ <title>Transaction Processing</title>
+
+ <para>
+ This chapter provides an overview of the internals of
+ <productname>PostgreSQL</productname>'s transaction management system.
+ The word transaction is often abbreviated as <firstterm>xact</firstterm>.
+ </para>
+
+ <sect1 id="transaction-id">
+
+ <title>Transactions and Identifiers</title>
+
+ <para>
+ Transactions can be created explicitly using <command>BEGIN</command>
+ or <command>START TRANSACTION</command> and ended using
+ <command>COMMIT</command> or <command>ROLLBACK</command>. SQL
+ statements outside of explicit transactions automatically use
+ single-statement transactions.
+ </para>
+
+ <para>
+ Every transaction is identified by a unique
+ <literal>VirtualTransactionId</literal> (also called
+ <literal>virtualXID</literal> or <literal>vxid</literal>), which
+ is comprised of a backend ID (or <literal>backendID</literal>)
+ and a sequentially-assigned number local to each backend, known as
+ <literal>localXID</literal>. For example, the virtual transaction
+ ID <literal>4/12532</literal> has a <literal>backendID</literal>
+ of <literal>4</literal> and a <literal>localXID</literal> of
+ <literal>12532</literal>.
+ </para>
+
+ <para>
+ Non-virtual <literal>TransactionId</literal>s (or <type>xid</type>),
+ e.g., <literal>278394</literal>, are assigned sequentially to
+ transactions from a global counter used by all databases within
+ the <productname>PostgreSQL</productname> cluster. This assignment
+ happens when a transaction first writes to the database. This means
+ lower-numbered xids started writing before higher-numbered xids.
+ Note that the order in which transactions perform their first database
+ write might be different from the order in which the transactions
+ started, particularly if the transaction started with statements that
+ only performed database reads.
+ </para>
+
+ <para>
+ The internal transaction ID type <type>xid</type> is 32 bits wide
+ and <link linkend="vacuum-for-wraparound">wraps around</link> every
+ 4 billion transactions. A 32-bit epoch is incremented during each
+ wraparound. There is also a 64-bit type <type>xid8</type> which
+ includes this epoch and therefore does not wrap around during the
+ life of an installation; it can be converted to xid by casting.
+ The functions in <xref linkend="functions-pg-snapshot"/>
+ return <type>xid8</type> values. Xids are used as the
+ basis for <productname>PostgreSQL</productname>'s <link
+ linkend="mvcc">MVCC</link> concurrency mechanism and streaming
+ replication.
+ </para>
+
+ <para>
+ When a top-level transaction with a (non-virtual) xid commits,
+ it is marked as committed in the <filename>pg_xact</filename>
+ directory. Additional information is recorded in the
+ <filename>pg_commit_ts</filename> directory if <xref
+ linkend="guc-track-commit-timestamp"/> is enabled.
+ </para>
+
+ <para>
+ In addition to <literal>vxid</literal> and <type>xid</type>,
+ prepared transactions are also assigned Global Transaction
+ Identifiers (<acronym>GID</acronym>). GIDs are string literals up
+ to 200 bytes long, which must be unique amongst other currently
+ prepared transactions. The mapping of GID to xid is shown in <link
+ linkend="view-pg-prepared-xacts"><structname>pg_prepared_xacts</structname></link>.
+ </para>
+ </sect1>
+
+ <sect1 id="xact-locking">
+
+ <title>Transactions and Locking</title>
+
+ <para>
+ The transaction IDs of currently executing transactions are shown in
+ <link linkend="view-pg-locks"><structname>pg_locks</structname></link>
+ in columns <structfield>virtualxid</structfield> and
+ <structfield>transactionid</structfield>. Read-only transactions
+ will have <structfield>virtualxid</structfield>s but NULL
+ <structfield>transactionid</structfield>s, while both columns will be
+ set in read-write transactions.
+ </para>
+
+ <para>
+ Some lock types wait on <structfield>virtualxid</structfield>,
+ while other types wait on <structfield>transactionid</structfield>.
+ Row-level read and write locks are recorded directly in the locked
+ rows and can be inspected using the <xref linkend="pgrowlocks"/>
+ extension. Row-level read locks might also require the assignment
+ of multixact IDs (<literal>mxid</literal>; see <xref
+ linkend="vacuum-for-multixact-wraparound"/>).
+ </para>
+ </sect1>
+
+ <sect1 id="subxacts">
+
+ <title>Subtransactions</title>
+
+ <para>
+ Subtransactions are started inside transactions, allowing large
+ transactions to be broken into smaller units. Subtransactions can
+ commit or abort without affecting their parent transactions, allowing
+ parent transactions to continue. This allows errors to be handled
+ more easily, which is a common application development pattern.
+ The word subtransaction is often abbreviated as
+ <firstterm>subxact</firstterm>.
+ </para>
+
+ <para>
+ Subtransactions can be started explicitly using the
+ <command>SAVEPOINT</command> command, but can also be started in
+ other ways, such as PL/pgSQL's <command>EXCEPTION</command> clause.
+ PL/Python and PL/Tcl also support explicit subtransactions.
+ Subtransactions can also be started from other subtransactions.
+ The top-level transaction and its child subtransactions form a
+ hierarchy or tree, which is why we refer to the main transaction as
+ the top-level transaction.
+ </para>
+
+ <para>
+ If a subtransaction is assigned a non-virtual transaction ID,
+ its transaction ID is referred to as a <quote>subxid</quote>.
+ Read-only subtransactions are not assigned subxids, but once they
+ attempt to write, they will be assigned one. This also causes all of
+ a subxid's parents, up to and including the top-level transaction,
+ to be assigned non-virtual transaction ids. We ensure that a parent
+ xid is always lower than any of its child subxids.
+ </para>
+
+ <para>
+ The immediate parent xid of each subxid is recorded in the
+ <filename>pg_subtrans</filename> directory. No entry is made for
+ top-level xids since they do not have a parent, nor is an entry made
+ for read-only subtransactions.
+ </para>
+
+ <para>
+ When a subtransaction commits, all of its committed child
+ subtransactions with subxids will also be considered subcommitted
+ in that transaction. When a subtransaction aborts, all of its child
+ subtransactions will also be considered aborted.
+ </para>
+
+ <para>
+ When a top-level transaction with an xid commits, all of its
+ subcommitted child subtransactions are also persistently recorded
+ as committed in the <filename>pg_xact</filename> subdirectory. If the
+ top-level transaction aborts, all its subtransactions are also aborted,
+ even if they were subcommitted.
+ </para>
+
+ <para>
+ The more subtransactions each transaction keeps open (not
+ rolled back or released), the greater the transaction management
+ overhead. Up to 64 open subxids are cached in shared memory for
+ each backend; after that point, the storage I/O overhead increases
+ significantly due to additional lookups of subxid entries in
+ <filename>pg_subtrans</filename>.
+ </para>
+ </sect1>
+
+ <sect1 id="two-phase">
+
+ <title>Two-Phase Transactions</title>
+
+ <para>
+ <productname>PostgreSQL</productname> supports a two-phase commit (2PC)
+ protocol that allows multiple distributed systems to work together
+ in a transactional manner. The commands are <command>PREPARE
+ TRANSACTION</command>, <command>COMMIT PREPARED</command> and
+ <command>ROLLBACK PREPARED</command>. Two-phase transactions
+ are intended for use by external transaction management systems.
+ <productname>PostgreSQL</productname> follows the features and model
+ proposed by the X/Open XA standard, but does not implement some less
+ often used aspects.
+ </para>
+
+ <para>
+ When the user executes <command>PREPARE TRANSACTION</command>, the
+ only possible next commands are <command>COMMIT PREPARED</command>
+ or <command>ROLLBACK PREPARED</command>. In general, this prepared
+ state is intended to be of very short duration, but external
+ availability issues might mean transactions stay in this state
+ for an extended interval. Short-lived prepared
+ transactions are stored only in shared memory and WAL.
+ Transactions that span checkpoints are recorded in the
+ <filename>pg_twophase</filename> directory. Transactions
+ that are currently prepared can be inspected using <link
+ linkend="view-pg-prepared-xacts"><structname>pg_prepared_xacts</structname></link>.
+ </para>
+ </sect1>
+
+</chapter>