Transacciones ACID y Niveles de Aislamiento
En cualquier sistema gestor de bases de datos relacional multiusuario, miles de usuarios y procesos leen y modifican información de manera concurrente. Para garantizar que los datos permanezcan íntegros y fiables en todo momento, las operaciones se agrupan en Transacciones que cumplen las propiedades ACID.
1. ¿Qué es una Transacción? #
Una transacción es una unidad lógica de trabajo indivisible compuesta por una o varias sentencias SQL (lecturas y escrituras) que deben ejecutarse como un bloque único.
1BEGIN TRANSACTION; 2 -- Paso 1: Restar dinero de la cuenta origen 3 UPDATE CUENTAS SET saldo = saldo - 500 WHERE id_cuenta = 1; 4 5 -- Paso 2: Sumar dinero en la cuenta destino 6 UPDATE CUENTAS SET saldo = saldo + 500 WHERE id_cuenta = 2; 7COMMIT; -- Confirmar y persistir los cambios definitivamente
- Si ocurre un fallo en el Paso 2 (ej. caída del servidor o saldo insuficiente), se ejecuta una orden de reversión:
1ROLLBACK; -- Deshacer todos los cambios y volver al estado inicial
2. Las Propiedades ACID #
Las 4 garantías fundamentales que debe ofrecer un motor transaccional son:
1┌─────────────────────────────────────────────────────────────────────────────┐ 2│ A - Atomicidad │ Comportamiento de "todo o nada". Si una parte falla, │ 3│ │ toda la transacción se revierte (ROLLBACK). │ 4├──────────────────┼──────────────────────────────────────────────────────────┤ 5│ C - Consistencia │ La transacción lleva a la base de datos de un estado │ 6│ │ válido a otro, respetando todas las reglas de integridad.│ 7├──────────────────┼──────────────────────────────────────────────────────────┤ 8│ I - Aislamiento │ Las transacciones simultáneas se ejecutan de forma │ 9│ │ independiente sin interferir entre sí. │ 10├──────────────────┼──────────────────────────────────────────────────────────┤ 11│ D - Durabilidad │ Una vez confirmado el COMMIT, los cambios son permanentes│ 12│ │ incluso si el servidor se apaga repentinamente (WAL). │ 13└─────────────────────────────────────────────────────────────────────────────┘
3. Fenómenos Anómalos de Concurrencia #
Cuando múltiples transacciones se ejecutan a la vez sin el aislamiento adecuado, pueden producirse tres anomalías clásicas:
Lectura Sucia (Dirty Read) #
Una transacción lee datos que han sido modificados por una transacción que todavía no ha hecho COMMIT. Si hace ROLLBACK, los datos leídos por nunca existieron realmente.
Lectura No Repetible (Non-repeatable Read) #
La transacción lee una fila concreta. A continuación, la transacción modifica o borra esa misma fila y hace COMMIT. Cuando vuelve a leer la misma fila dentro de su propia transacción, encuentra valores distintos.
Lectura Fantasma (Phantom Read) #
La transacción ejecuta una consulta que devuelve un conjunto de filas que cumplen una condición (ej. WHERE salario > 2000). La transacción inserta nuevas filas que cumplen esa condición y hace COMMIT. Si repite la consulta, aparecen filas «fantasma» que antes no estaban.
4. Los 4 Niveles de Aislamiento Estándar en SQL #
El estándar ANSI/ISO SQL define cuatro niveles de aislamiento crecientes. A mayor nivel de aislamiento, mayor consistencia pero menor rendimiento y mayor contención por bloqueos:
1SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
| Nivel de Aislamiento | Lectura Sucia (Dirty Read) | Lectura No Repetible (Non-rep Read) | Lectura Fantasma (Phantom Read) | Uso Habitual |
|---|---|---|---|---|
READ UNCOMMITTED | ⚠️ Permitida | ⚠️ Permitida | ⚠️ Permitida | Rara vez usado (informes masivos no críticos). |
READ COMMITTED | 🛡️ Evitada | ⚠️ Permitida | ⚠️ Permitida | Por defecto en PostgreSQL, Oracle y SQL Server. |
REPEATABLE READ | 🛡️ Evitada | 🛡️ Evitada | ⚠️ Permitida (o prevenida en MVCC) | Por defecto en MySQL (InnoDB). |
SERIALIZABLE | 🛡️ Evitada | 🛡️ Evitada | 🛡️ Evitada | Máxima seguridad (banca, transferencias críticas). |
TIP
La mayoría de los motores relacionales modernos utilizan MVCC (Multi-Version Concurrency Control) para que las lecturas no bloqueen a las escrituras ni las escrituras bloqueen a las lecturas, logrando un equilibrio óptimo entre consistencia y rendimiento concurrente.
Resumen del tema
Conceptos clave #
- Transacción: unidad atómica de ejecución delimitada por
BEGIN,COMMITyROLLBACK. - Tríada ACID: Atomicidad (todo o nada), Consistencia (reglas e integridad), Aislamiento (independencia concurrente) y Durabilidad (persistencia en disco tras commit).
- Lectura Sucia: leer datos no confirmados que pueden ser descartados.
- Lectura No Repetible: cambio en los valores de una fila ya leída dentro de la misma transacción.
- Lectura Fantasma: aparición de nuevas filas en una consulta de rango tras una inserción externa confirmada.
- Niveles de aislamiento: graduación entre rendimiento y consistencia desde
READ COMMITTEDhastaSERIALIZABLE.
Qué debes recordar #
READ COMMITTED evita lecturas sucias y es el estándar industrial más utilizado; para operaciones financieras donde un recálculo no puede tolerar lecturas no repetibles ni fantasmas se emplea SERIALIZABLE.