sql >> Base de Datos >  >> RDS >> PostgreSQL

Establecer atómicamente el valor SERIAL al confirmar la transacción

PostgreSQL 9.5 introdujo una nueva característica relacionada con este problema:commit timestamps .

Solo necesita activar track_commit_timestamp en postgresql.conf (¡y reinicie!) para comenzar a rastrear las marcas de tiempo de confirmación. Entonces puedes consultar:

SELECT * FROM tbl
WHERE  pg_xact_commit_timestamp(xmin) >= '2015-11-26 18:00:00+01';

Lea el capítulo "Commit timestamp tracking" en Postgres Wiki.
Utilidad relacionada funciones en el manual .

La volatilidad de la función es solo VOLATILE porque los ID de transacción (xid ) puede ajustarse por definición. Entonces no puede crear un índice funcional en él.
Podrías falsificar IMMUTABLE volatilidad en un contenedor de funciones para aplicaciones en un marco de tiempo limitado, pero debe ser consciente de las implicaciones. Caso relacionado con más explicación:

Para muchos casos de uso (¿como el suyo?) que solo están interesados ​​en la secuencia de confirmaciones (y no en el tiempo absoluto), podría ser más eficiente trabajar con xmin convertir a bigint "directamente" (xmin::text::bigint ) en lugar de marcas de tiempo de confirmación. (xid es un entero sin signo internamente, la mitad superior que no cabe en un integer con signo .) Una vez más, tenga en cuenta las limitaciones debidas a un posible ajuste de xid.

Por la misma razón, las marcas de tiempo de confirmación no se conservan indefinidamente . Para bases de datos pequeñas o medianas, xid el ajuste casi nunca ocurre, pero eventualmente lo hará si el clúster está activo durante el tiempo suficiente. Lea el capítulo "Prevención de fallas de ajuste de ID de transacción" en el manual para más detalles.