Contenido de esta guía
Qué significa el nivel de aislamiento
El nivel de aislamiento define qué puede observar una transacción mientras otras transacciones trabajan al mismo tiempo. No cambia la intención de tu SELECT o UPDATE; cambia qué estados concurrentes pueden ser visibles y qué conflictos debe resolver el motor.
Es la “I” de ACID y se vuelve importante cuando dos sesiones leen o modifican los mismos datos de manera concurrente.
Los cuatro nombres del estándar
| Nivel | Idea práctica |
|---|---|
READ UNCOMMITTED | El nivel nominalmente más permisivo. |
READ COMMITTED | Cada lectura ve datos confirmados según las reglas del motor. |
REPEATABLE READ | Busca que una transacción mantenga una visión más estable durante varias lecturas. |
SERIALIZABLE | El nivel más estricto; el resultado debe ser compatible con alguna ejecución en serie de las transacciones. |
Los nombres son estándar, pero la implementación no es idéntica. PostgreSQL, por ejemplo, acepta los cuatro nombres aunque READ UNCOMMITTED se comporta como READ COMMITTED. InnoDB de MySQL ofrece los cuatro y usa REPEATABLE READ como valor predeterminado.
No copies la sintaxis entre motores sin comprobarla
En PostgreSQL puedes especificar el aislamiento al iniciar una transacción:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- lecturas y cambios
COMMIT;En MySQL es habitual configurar la siguiente transacción y después iniciarla:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- lecturas y cambios
COMMIT;Cómo razonar sobre la elección
No elijas un nivel solo porque parezca “más seguro”. Un aislamiento más estricto puede cambiar la concurrencia, los bloqueos, los reintentos o los errores de serialización. La elección pertenece al diseño de la aplicación y debe probarse con sus patrones reales de lectura y escritura.
- Identifica qué lecturas deben ser coherentes entre sí.
- Define qué cambios concurrentes son aceptables.
- Comprueba el valor predeterminado de tu motor.
- Diseña la aplicación para manejar conflictos y reintentos cuando correspondan.
SQLite tiene un modelo diferente
SQLite no expone los cuatro niveles estándar de la misma forma que PostgreSQL o InnoDB. Su documentación describe el aislamiento entre conexiones y explica que, salvo casos concretos de caché compartida con PRAGMA read_uncommitted, las conexiones separadas no ven cambios no confirmados de otras conexiones. Por eso no conviene trasladar directamente una receta de SET TRANSACTION ISOLATION LEVEL a SQLite.
Error frecuente
Suponer que el mismo nombre implica el mismo comportamiento exacto
Los motores implementan concurrencia con mecanismos diferentes. Lee la documentación del motor y prueba escenarios de dos conexiones si la consistencia depende del aislamiento.
Comprueba lo aprendido
Elige qué debes investigar
Un proceso genera un informe con varias consultas y necesitas saber si todas deben observar el mismo estado lógico de los datos. ¿Qué tres comprobaciones harías antes de cambiar el nivel de aislamiento?
Respuesta razonada
Primero comprobaría el aislamiento predeterminado y su semántica real en ese motor. Después definiría qué cambios concurrentes puede tolerar el informe entre una consulta y la siguiente. Por último probaría el nivel candidato con dos sesiones, midiendo también bloqueos, abortos o necesidad de reintentos. El nombre del nivel por sí solo no sustituye estas pruebas.
Qué debes recordar
- El aislamiento trata de la interacción entre transacciones concurrentes.
- Los cuatro nombres estándar no garantizan implementaciones idénticas.
- PostgreSQL e InnoDB tienen valores predeterminados distintos.
- SQLite requiere razonar con su propio modelo de aislamiento y concurrencia.