El aislamiento de transacciones afecta cómo las transacciones concurrentes ven los cambios entre sí. Es una parte importante de las propiedades ACID. En ANSI SQL hay cuatro niveles de aislamiento básicos:
La elección del nivel depende de los requisitos de la aplicación:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; -- Las siguientes SELECT verán valores "congelados"
"¿Garantiza el nivel REPEATABLE READ la protección contra lecturas fantasma en cualquier base de datos?"
No. En PostgreSQL y algunas otras bases de datos, el nivel REPEATABLE READ solo previene lecturas sucias y no repetibles, pero no necesariamente protege contra lecturas fantasma. En MySQL/InnoDB, REPEATABLE READ es esencialmente SERIALIZABLE, pero en otras bases de datos — no.
-- En una transacción leemos SELECT * FROM orders WHERE amount > 100; -- En otra transacción se inserta un nuevo valor con amount > 100 y se confirma -- La primera transacción al volver a hacer SELECT verá una fila "fantasma" si el aislamiento es inferior a SERIALIZABLE
Historia
Un servicio financiero bloqueó solo READ COMMITTED por razones de rendimiento — el usuario vio un monto que ya había sido modificado por otro proceso, aparecieron discrepancias en el saldo.
Historia
En un sistema de reservas de hoteles se produjeron reservas dobles de la misma habitación — las transacciones no aislaron la descarga de reservas actuales, el nivel era READ COMMITTED.
Historia
Transición de MySQL a PostgreSQL: el desarrollador estaba acostumbrado a que REPEATABLE READ protegiera contra fantasmas, pero tras la migración aparecieron pedidos "atrapados" que no se esperaban al realizar consultas repetidas en la misma transacción.