Niveles de aislamiento de transacciones
¿Cuáles son los niveles de aislamiento de transacciones en PostgreSQL?
El nivel de aislamiento decide cuánto ve una transacción de los cambios de las transacciones concurrentes. PostgreSQL usa Read Committed de forma predeterminada y también ofrece Repeatable Read y Serializable.
El estándar SQL define cuatro niveles de aislamiento según las anomalías que permiten: lecturas sucias, lecturas no repetibles, lecturas fantasma y anomalías de serialización. PostgreSQL acepta los cuatro nombres de nivel, pero Read Uncommitted se comporta como Read Committed, así que en la práctica hay tres: Read Committed, Repeatable Read y Serializable.
Read Committed, el nivel predeterminado, da a cada sentencia una instantánea nueva, así que dos consultas de la misma transacción pueden ver datos distintos. Repeatable Read usa una sola instantánea para toda la transacción. Serializable agrega comprobaciones para que las transacciones concurrentes se comporten como si se hubieran ejecutado una a la vez. En los dos niveles más estrictos, una transacción puede fallar con un error de serialización, y la aplicación debe reintentarla.
Ejemplo
El ejemplo muestra el nivel predeterminado del servidor, luego inicia una transacción Repeatable Read y lo verifica con SHOW transaction_isolation. Todas las lecturas dentro de esa transacción usan la misma instantánea.
CREATE TABLE stock (sku text PRIMARY KEY, qty int);
INSERT INTO stock VALUES ('A-1', 5);
SHOW default_transaction_isolation;
BEGIN ISOLATION LEVEL REPEATABLE READ;
SHOW transaction_isolation;
SELECT qty FROM stock WHERE sku = 'A-1';
COMMIT;SQL simple para PostgreSQL 16 o 17 estándar, sin extensiones. Ejecútalo en una base de datos vacía que puedas descartar.
Fuentes
Documentación oficial de PostgreSQL (en inglés).