Además de sus columnas regulares, las tablas de Postgres también tienen varias columnas del sistema disponibles. Uno de ellos, xmin
almacena la ID de transacción utilizada para crear una fila. Su tipo de datos es xid
un entero de cuatro bytes que se envuelve en algún momento (es decir, no necesariamente único). La función txid_current()
a su vez devuelve la ID de transacción actual, pero como bigint
, porque "se extiende con un contador" de época "para que no se ajuste durante la vida de una instalación" (para citar el manual ).
Si aún no se realizaron las transacciones, ambos valores parecen coincidir:
# CREATE TABLE test (label text);
CREATE TABLE
# INSERT INTO test VALUES ('test') RETURNING txid_current();
txid_current
--------------
674500
(1 row)
INSERT 0 1
# SELECT xmin FROM test;
xmin
--------
674500
(1 row)
Pero me pregunto: ¿son estos dos valores siempre comparables? Según tengo entendido, txid_current()
continuará entregando valores únicos después de la identificación de la transacción (como máximo 2 ^ 32 transacciones) y xmin
comenzará desde cero. ¿Esto significa que ambos comienzan a devolver valores diferentes en ese punto?
Y si esto es cierto, ¿hay alguna forma de extraer xid
un txid_current()
resultado regular para que coincida con las xmin
entradas de una tabla (por ejemplo, convertir txid_current()
a entero)?
Editar : deje en claro que me importa lo que sucede después de que se envuelve un ID de transacción, lo que muy probablemente ocurre mucho antes de 2 ^ 32 transacciones. Gracias a Daniel Vérité por notar esto en los comentarios.
xmin
se congela, la pregunta sigue siendo qué tan nuevo (regular) se xmin
compara con un entonces ejecutado txid_current()
.
VACUUM FREEZE
sobrescribirá lasxmin
filas mucho antes de la envoltura 2 ^ 32. Echa un vistazo a Freezing Your Tuples Off para obtener una descripción general del tema.