Las transacciones se pueden crear explícitamente usando BEGIN
o START TRANSACTION y finalizar usando
COMMIT o ROLLBACK. Las sentencias SQL
fuera de transacciones explícitas utilizan automáticamente transacciones de
sentencia única.
Cada transacción se identifica mediante un identificador único
VirtualTransactionId (también llamado
virtualXID o vxid), el cual
está compuesto por el número de proceso del backend (o procNumber)
y un número asignado secuencialmente local a cada backend, conocido como
localXID. Por ejemplo, el ID de transacción virtual
4/12532 tiene un procNumber
de 4 y un localXID de
12532.
Los identificadores TransactionId no virtuales (o xid),
por ejemplo, 278394, se asignan secuencialmente a las
transacciones a partir de un contador global utilizado por todas las bases de datos dentro
del clúster de PostgreSQL. Esta asignación
ocurre cuando una transacción escribe por primera vez en la base de datos. Esto significa
que los xids con números más bajos comenzaron a escribir antes que los xids con números más altos.
Ten en cuenta que el orden en que las transacciones realizan su primera escritura en la base de
datos puede ser diferente del orden en que comenzaron las transacciones, particularmente si la
transacción comenzó con sentencias que solo realizaron lecturas en la base de datos.
El tipo de ID de transacción interno xid es de 32 bits
y se reinicia (wraps around) cada
4 mil millones de transacciones. Se incrementa una época (epoch) de 32 bits durante cada
reinicio. También existe un tipo de 64 bits xid8 que
incluye esta época y, por lo tanto, no se reinicia durante la vida de
una instalación; se puede convertir a xid mediante una conversión de tipo (casting).
Las funciones en Table 9.84
devuelven valores xid8. Los xids se utilizan como la
base para el mecanismo de concurrencia MVCC de
PostgreSQL y para la replicación en flujo (streaming replication).
Cuando una transacción de nivel superior con un xid (no virtual) se confirma (commits),
se marca como confirmada en el directorio pg_xact.
Se registra información adicional en el directorio pg_commit_ts
si se habilita track_commit_timestamp.
Además de vxid y xid,
a las transacciones preparadas también se les asignan Identificadores de Transacción Global
(GID). Los GIDs son literales de cadena de hasta 200 bytes de longitud,
que deben ser únicos entre otras transacciones actualmente preparadas. La asignación
de GID a xid se muestra en pg_prepared_xacts.