El nivel de aislamiento de transacciones REPEATABLE_READ de PostgreSQL 12 evita lecturas sucias, lecturas no repetibles y lecturas fantasma. A diferencia del nivel de aislamiento READ_COMMITTED, el nivel de aislamiento REPEATABLE_READ evita lecturas no repatriables y lecturas fantasma.
Supongo que esto tiene un costo, de lo contrario, uno simplemente haría que ambos fueran iguales. ¿Cómo garantiza postgres que esos 3 fenómenos de lectura no ocurran?
READ COMMITTED y REPEATABLE READ usan la misma tecnología: una instantánea que determina cuál de las versiones de una fila en la tabla puede ver una transacción. La diferencia es que con READ COMMITTED , la instantánea se toma al comienzo de cada declaración, de modo que cada nueva declaración puede ver todo lo que se ha confirmado antes, mientras que una transacción REPEATABLE READ usa la misma instantánea para todas las declaraciones.
Hay dos consecuencias:
en todo caso, REPEATABLE READ es más barato que READ COMMITTED , porque toma menos instantáneas
REPEATABLE READ proporciona un aislamiento aún mayor que el requerido por el estándar SQL: la base de datos no parece cambiar en absoluto
El precio que está pagando por REPEATABLE READ es diferente:
corre el riesgo de errores de serialización, que lo obligan a repetir la transacción
VACUUM no puede limpiar las filas marcadas como inactivas después de que comenzó la transacción REPEATABLE READ