Transacciones · concurrencia

Nivel de aislamiento de una transacción

Entiende qué puede observar una transacción mientras otras leen o modifican los mismos datos.

Lectura: 5–7 minConcurrenciaPostgreSQL · MySQL · SQLite
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

NivelIdea práctica
READ UNCOMMITTEDEl nivel nominalmente más permisivo.
READ COMMITTEDCada lectura ve datos confirmados según las reglas del motor.
REPEATABLE READBusca que una transacción mantenga una visión más estable durante varias lecturas.
SERIALIZABLEEl 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:

PostgreSQL
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- lecturas y cambios
COMMIT;

En MySQL es habitual configurar la siguiente transacción y después iniciarla:

MySQL 8.4
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.

  1. Identifica qué lecturas deben ser coherentes entre sí.
  2. Define qué cambios concurrentes son aceptables.
  3. Comprueba el valor predeterminado de tu motor.
  4. 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

Intermedia · concurrencia

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?

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.

Conceptos relacionados

Fuentes técnicas