Sobes.tech
Middle

¿Qué niveles de aislamiento de transacciones en bases de datos conoces?

sobes.tech AI

Respuesta de la IA

En el estándar SQL se definen cuatro niveles de aislamiento de transacciones: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: El nivel más bajo. La transacción puede leer datos que aún no han sido confirmados (es decir, realizados por otra transacción que aún no ha finalizado con COMMIT). Esto conduce a lecturas "sucias" (dirty reads).

  2. Read Committed: La transacción solo ve los datos que han sido confirmados antes o durante su ejecución. Previene las lecturas "sucias", pero permite lecturas no repetibles (non-repeatable reads) y fantasmas (phantom reads).

    • Lecturas no repetibles: La misma lectura en una transacción puede devolver datos diferentes porque otra transacción los ha modificado y confirmado entre lecturas.
    • Fantasmas: Al ejecutar una consulta con condición WHERE, otra transacción añade o elimina filas que cumplen la condición, y la misma consulta ejecutada nuevamente en la misma transacción devuelve un conjunto diferente de filas.
  3. Repeatable Read: La transacción solo ve los datos que fueron confirmados antes de su inicio. Garantiza que las mismas lecturas de las mismas filas en una transacción devolverán los mismos datos. Previene las lecturas "sucias" y no repetibles. Permite fantasmas.

    // Ejemplo de Repeatable Read
    // Transacción 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Por ejemplo, 100
    
    // Transacción 2 (ejecutándose simultáneamente)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Nuevo usuario', 'active');
    // COMMIT;
    
    // Transacción 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Todavía 100 (fantasma)
    // COMMIT;
    
  4. Serializable: El nivel más alto de aislamiento. Garantiza que la ejecución paralela de transacciones será equivalente a alguna ejecución secuencial de esas transacciones. Previene lecturas "sucias", no repetibles y fantasmas. Puede reducir el rendimiento debido a bloqueos.

En diferentes sistemas de gestión de bases de datos (SGBD) pueden existir implementaciones y características propias de los niveles de aislamiento, así como niveles adicionales. Por ejemplo, en MySQL InnoDB, el nivel por defecto es Repeatable Read.