Niveles de aislamiento13 temas

Niveles de aislamiento

El nivel de aislamiento determina qué anomalías de concurrencia se toleran en las transacciones. El estándar SQL define cuatro niveles, cada uno con un balance distinto entre protección y rendimiento.


Cómo el nivel de aislamiento determina qué anomalías se permiten

Cada nivel de aislamiento permite un conjunto distinto de anomalías. La base de datos no las elimina por sí sola: el nivel de configuración define el alcance de la protección.

Los cuatro niveles en progresión

Read Uncommitted Sin protección

Una transacción puede leer datos que otra está modificando, incluso si los cambios aún no han sido confirmados.

Lectura sucia No repetible Fantasma Actualización perdida
Read Committed Protección media

Cada consulta visualiza únicamente los datos confirmados hasta el momento. Esto previene lecturas sucias, ya que ignora modificaciones no confirmadas.

Lectura sucia No repetible Fantasma Actualización perdida
Repeatable Read Alta protección

Todas las lecturas dentro de una transacción operan sobre una instantánea tomada en el primer acceso. Si otra transacción modifica y confirma una fila, la transacción original sigue visualizando el valor inicial.

Lectura sucia No repetible Fantasma Actualización perdida
Serializable Protección total

Es el nivel de aislamiento más estricto. Las transacciones se ejecutan como si fueran secuenciales. Garantiza total inmunidad contra todas las anomalías de concurrencia.

Sin anomalías

Trade-offs

Enfoque Ventaja Desventaja
Read Uncommitted Rápido Máximo rendimiento Anomalías Permite lecturas sucias, no repetibles y fantasmas
Read Committed Seguro Protege contra lectura sucia Anomalías Permite lecturas no repetibles y fantasmas
Repeatable Read Estable Elimina lecturas no repetibles Limitado Permite fantasmas, menor concurrencia
Serializable Total Elimina todas las anomalías Lento Mínimo rendimiento, puede requerir reintentos

Ejemplos de casos de uso

Situación Recomendación
Reportes de auditoría sobre datos históricos Aceptar fantasmas y lecturas no repetibles — los datos no cambian
Contadores de likes o visitas Aceptar actualizaciones perdidas — el valor se puede recalcular
Transacciones financieras Exigir no aceptar ninguna anomalía — requerir Serializable
Catálogo de productos en una web Aceptar lecturas no repetibles — la precisión total no es crítica

Cómo se comportan los niveles de aislamiento en la práctica

Los siguientes ejemplos ejecutan la misma operación en distintos niveles. La diferencia está en qué ve la segunda consulta y cómo reacciona el motor ante el conflicto.

Read Committed: lectura no repetible

-- Sesión 1                       |  -- Sesión 2
BEGIN;                             |
SELECT saldo FROM cuentas          |
  WHERE id = 'A';                  |
100                              |
                                   |  BEGIN;
                                   |  UPDATE cuentas SET saldo = 200
                                   |    WHERE id = 'A';
                                   |  COMMIT;
SELECT saldo FROM cuentas          |
  WHERE id = 'A';                  |
200   ← cambió entre lecturas   |
COMMIT;                            |

T1 lee el saldo dos veces. Entre ambas, T2 modifica el saldo y hace commit. Como RC toma una nueva instantánea por consulta, la segunda lectura ve el valor actualizado.

Hay una lectura no repetible

Repeatable Read: lectura estable

-- Sesión 1                       |  -- Sesión 2
BEGIN;                             |
SELECT saldo FROM cuentas          |
  WHERE id = 'A';                  |
100                              |
                                   |  BEGIN;
                                   |  UPDATE cuentas SET saldo = 200
                                   |    WHERE id = 'A';
                                   |  COMMIT;
SELECT saldo FROM cuentas          |
  WHERE id = 'A';                  |
100   ← misma instantánea       |
COMMIT;                            |

Repeatable Read mantiene la instantánea durante toda la transacción. T2 modificó el dato, pero T1 sigue viendo el valor original.

No hay lectura no repetible.

Serializable: detección de conflicto

-- Sesión 1                       |  -- Sesión 2
BEGIN;                             |
SELECT saldo FROM cuentas          |
  WHERE id = 'A';                  |
100                              |
                                   |  BEGIN;
                                   |  SELECT saldo FROM cuentas
                                   |    WHERE id = 'A';
                                   |  → 100
UPDATE cuentas SET saldo = 200     |
  WHERE id = 'A';                  |
COMMIT;                            |
-- T1 modifica y confirma          |
                                   |  UPDATE cuentas SET saldo = 300
                                   |    WHERE id = 'A';
                                   |  → Serializable detecta que T2
                                   |    leyó datos desactualizados
                                   |  COMMIT;
                                   |  → ERROR: conflicto de serialización
                                   |  T2 debe abortar y reintentar
-- Resultado: saldo = 200          |

A diferencia de RC o RR, donde T2 espera el lock y escribe, Serializable detecta que T2 operó sobre datos desactualizados y cancela la transacción.

El costo: reintentos


Errores frecuentes

Error: Serializable es siempre la mejor opción porque da la máxima protección.

No. Serializable ofrece máxima consistencia pero mínima concurrencia. Las transacciones compiten, se cancelan y reintentan. Usarlo sin necesidad es sobredimensionado y perjudica el rendimiento.


Error: Read Committed previene todas las anomalías de lectura.

Falso. Read Committed solo previene lecturas sucias. Las no repetibles y fantasmas ocurren porque cada consulta ve una instantánea distinta. Para lecturas estables se necesita al menos Repeatable Read.

Autoevaluación: Niveles de Aislamiento

1/3

Relación entre niveles de aislamiento y anomalías

Haz clic en cualquier celda para ver el comportamiento de esa combinación.

NivelSuciaNo rep.FantasmaPerdida
Read Uncommitted1
Read Committed2
Repeatable Read3
Serializable4