Los cuatro niveles de aislamiento
Desde Read Uncommitted hasta Serializable y qué permite cada nivel.
Los cuatro niveles de aislamiento es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.
La pregunta detrás de la pregunta
Cuando un entrevistador le pide que "mencione los cuatro niveles de aislamiento", la verdadera prueba es si puede explicar el compromiso: un aislamiento más fuerte implica menos anomalías, pero también una menor concurrencia.
El estándar SQL define cuatro niveles, ordenados del más débil al más fuerte:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
Cada nivel permite o prohíbe un conjunto específico de anomalías de lectura. Esta lección cubre los niveles; la siguiente explica las anomalías en detalle.
Configuración del nivel de aislamiento
El aislamiento se configura por transacción o por sesión. La sintaxis es casi idéntica en los distintos motores.
Si no lo configura, cada base de datos tiene un valor predeterminado. Conocer los valores predeterminados es una pregunta frecuente en las entrevistas, así que los veremos al final.
-- Per transaction (standard SQL)
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- ... statements ...
COMMIT;
-- Per session
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;Nivel 1: READ UNCOMMITTED
READ UNCOMMITTED es el nivel más débil. Una transacción puede leer filas que otra transacción ha modificado pero que aún no ha confirmado. Estas se denominan lecturas sucias.
Si la otra transacción se revierte, habrá leído datos que nunca existieron oficialmente. Esto es peligroso para cualquier operación que deba ser precisa.
Nota: Postgres trata READ UNCOMMITTED igual que READ COMMITTED, por lo que nunca realiza lecturas sucias. SQL Server y MySQL sí lo implementan.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
-- may see another transaction's uncommitted (dirty) rows
SELECT balance FROM accounts WHERE id = 1;
COMMIT;Nivel 2: READ COMMITTED
READ COMMITTED garantiza que solo leerá datos que hayan sido confirmados. No hay lecturas sucias.
Sin embargo, cada instrucción ve la instantánea confirmada más reciente. Si ejecuta la misma consulta dos veces dentro de una transacción, otra transacción confirmada entre ambas puede cambiar el resultado. Esa anomalía es una lectura no repetible.
Este es el valor predeterminado en Postgres, Oracle y SQL Server, y constituye un equilibrio razonable para la mayoría de las aplicaciones.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM accounts WHERE id = 1; -- returns 500
-- another transaction commits an update to id = 1
SELECT balance FROM accounts WHERE id = 1; -- may now return 700
COMMIT;Nivel 3: REPEATABLE READ
REPEATABLE READ garantiza que, si lee una fila dos veces dentro de la misma transacción, obtendrá el mismo valor en ambas ocasiones. Toma una instantánea coherente al comienzo de la transacción.
Evita las lecturas sucias y las lecturas no repetibles. El estándar aún permite las lecturas fantasma: filas nuevas que coinciden con su cláusula WHERE y aparecen al volver a consultar.
Importante: este es el valor predeterminado en MySQL/InnoDB, y la implementación de InnoDB también bloquea la mayoría de las lecturas fantasma mediante bloqueos next-key.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE id = 1; -- 500
-- another transaction commits a change to id = 1
SELECT balance FROM accounts WHERE id = 1; -- still 500 in this txn
COMMIT;Nivel 4: SERIALIZABLE
SERIALIZABLE es el nivel más estricto. La base de datos garantiza que el resultado de ejecutar transacciones simultáneamente sea idéntico al de ejecutarlas una después de otra en algún orden serial.
Evita las lecturas sucias, las lecturas no repetibles y las lecturas fantasma. El coste es una mayor cantidad de bloqueos o, en Postgres, abortos por fallos de serialización que deberá reintentar.
Forma de expresarlo en una entrevista: "SERIALIZABLE da la impresión de que cada transacción se ejecutó sola, a cambio de una menor concurrencia y posibles reintentos."
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
INSERT INTO audit (total) VALUES (...);
COMMIT; -- may raise a serialization_failure you retryLa matriz de anomalías
Lo más útil que puede memorizar es qué anomalías permite cada nivel. "Sí" significa que la anomalía puede producirse.
- READ UNCOMMITTED: lecturas sucias=Sí, lecturas no repetibles=Sí, lecturas fantasma=Sí
- READ COMMITTED: lecturas sucias=No, lecturas no repetibles=Sí, lecturas fantasma=Sí
- REPEATABLE READ: lecturas sucias=No, lecturas no repetibles=No, lecturas fantasma=Sí (según el estándar)
- SERIALIZABLE: lecturas sucias=No, lecturas no repetibles=No, lecturas fantasma=No
Cada nivel superior prohíbe una anomalía adicional. Esa progresión es la respuesta completa.
El estándar frente a las implementaciones reales
Una distinción importante para perfiles sénior: el estándar SQL define los niveles según las anomalías que deben impedir, no según la forma de hacerlo. Los motores reales suelen impedir más anomalías.
- Postgres REPEATABLE READ usa aislamiento mediante instantáneas y también bloquea las lecturas fantasma, aunque todavía puede producirse un write-skew.
- MySQL/InnoDB REPEATABLE READ bloquea las lecturas fantasma mediante bloqueos next-key.
- Postgres SERIALIZABLE usa SSI (Serializable Snapshot Isolation) y aborta en caso de conflicto en lugar de aplicar bloqueos intensivos.
Mencionar esto demuestra que sabe que el estándar es un mínimo garantizado, no una descripción exacta del comportamiento.
Niveles predeterminados por motor
Los valores predeterminados aparecen constantemente. Memorice estos:
- PostgreSQL: READ COMMITTED
- Oracle: READ COMMITTED (nunca permite lecturas sucias)
- SQL Server: READ COMMITTED
- MySQL (InnoDB): REPEATABLE READ
La excepción de MySQL es una trampa habitual. Si le preguntan "¿cuál es el nivel de aislamiento predeterminado?", aclare primero el motor.
Elegir un nivel en la práctica
¿Cómo debe decidir? Plantéelo como un equilibrio entre riesgo y rendimiento.
- Use READ COMMITTED para OLTP habitual: es rápido y evita las lecturas sucias.
- Use REPEATABLE READ cuando una transacción lea los mismos datos varias veces y deba mantenerlos estables (informes y cálculos en varios pasos).
- Use SERIALIZABLE para lógica crítica para la corrección, cuando no se pueda aceptar ninguna anomalía, y diseñe una lógica de reintento para los abortos.
Casi nunca debe usar READ UNCOMMITTED en producción.
Preguntas habituales de seguimiento
Después de enumerar los niveles, los entrevistadores suelen plantear preguntas rápidas de seguimiento. Prepare respuestas claras:
- "¿Qué nivel evita las lecturas sucias, pero permite las lecturas no repetibles?" READ COMMITTED.
- "¿Cuál es la única anomalía que REPEATABLE READ todavía permite según el estándar?" Las lecturas fantasma.
- "¿Por qué no usar siempre SERIALIZABLE?" Reduce la concurrencia y puede obligar a reintentar las transacciones cuando fallan las operaciones de serialización.
- "¿Un nivel superior tiene un coste mayor?" Sí, ya sea por los bloqueos o por el coste de abortar y reintentar.
Responder esto al instante demuestra que ha interiorizado la progresión y no se ha limitado a memorizarla.
Comprobación rápida
Uno de estos datos sobre los niveles predeterminados es el que más se pregunta.
Resumen: cuatro niveles, una sola disyuntiva
Los cuatro niveles de aislamiento forman una progresión del más débil al más fuerte: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE. Cada nivel superior prohíbe una anomalía adicional (sucia, no repetible o fantasma) a cambio de una menor concurrencia.
Recuerde los valores predeterminados (READ COMMITTED en todos los motores salvo REPEATABLE READ en MySQL) y tenga presente que los motores reales suelen impedir más anomalías de las que exige el estándar. A continuación, examinaremos las tres anomalías de lectura que estos niveles están diseñados para evitar.
Preguntas frecuentes
¿La lección «Los cuatro niveles de aislamiento» es gratis?
Sí — el texto completo de «Los cuatro niveles de aislamiento» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Los cuatro niveles de aislamiento»?
Desde Read Uncommitted hasta Serializable y qué permite cada nivel. Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Coding Interview Prep?
No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Los cuatro niveles de aislamiento»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?
Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Explicación de las propiedades ACID
- Los cuatro niveles de aislamiento
- Lecturas sucias, no repetibles y fantasma
- Interbloqueos, bloqueos y MVCC