- linkend="vacuum-for-multixact-wraparound"/>).
-
-
-
-
-
-
Subtransactions
-
- 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
- subxact .
-
-
- Subtransactions can be started explicitly using the
- SAVEPOINT command, but can also be started in
- other ways, such as PL/pgSQL's EXCEPTION 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.
-
-
- If a subtransaction is assigned a non-virtual transaction ID,
- its transaction ID is referred to as a subxid
.
- 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.
-
-
- The immediate parent xid of each subxid is recorded in the
- pg_subtrans 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.
-
-
- 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.
-
-
- When a top-level transaction with an xid commits, all of its
- subcommitted child subtransactions are also persistently recorded
- as committed in the pg_xact directory. If the
- top-level transaction aborts, all its subtransactions are also aborted,
- even if they were subcommitted.
-
-
- 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
- pg_subtrans .
-
-
-
-
-
-
Two-Phase Transactions
-
-
PostgreSQL supports a two-phase commit (2PC)
- protocol that allows multiple distributed systems to work together
- in a transactional manner. The commands are PREPARE
- TRANSACTION, COMMIT PREPARED and
- ROLLBACK PREPARED . Two-phase transactions
- are intended for use by external transaction management systems.
-
PostgreSQL follows the features and model
- proposed by the X/Open XA standard, but does not implement some less
- often used aspects.
-
-
- When the user executes PREPARE TRANSACTION , the
- only possible next commands are COMMIT PREPARED
- or ROLLBACK PREPARED . 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
- pg_twophase directory. Transactions
- that are currently prepared can be inspected using
- linkend="view-pg-prepared-xacts">pg_prepared_xacts .
-
-
-
-