Transacciones - ACID
Una transacción de base de datos es una secuencia de una o más operaciones lógicas (como inserciones, actualizaciones o eliminaciones) que se tratan como una unidad de trabajo asegurando que estas operaciones se completen por completo (commit) o se anulen totalmente (rollback). Su objetivo fundamental es simplificar la programación ante fallos y accesos concurrentes, trasladando la complejidad de la gestión de la fiabilidad a la base de datos.
ACID
- Atomicidad (Atomicity): Asegura que una transacción se complete por completo o no se realice en absoluto.
- Consistencia (Consistency): Asegura que las reglas definidas por la aplicación (constraints, claves foráneas, unicidad, etc) se mantengan antes y después de la transacción.
- Aislamiento (Isolation): Permite que múltiples transacciones se ejecuten simultáneamente sin interferir entre sí.
- Durabilidad (Durability): Garantiza que, una vez que una transacción se confirma, sus cambios son permanentes y persistirán incluso en caso de fallos de hardware o del sistema.
Transacciones y Niveles de aislamiento
Antes de continuar, primero unos conceptos:
- Dirty Read: Se produce cuando una transacción lee datos que aún no se han confirmado.
- Dirty Write: Ocurre cuando una transacción sobrescribe un valor que fue escrito por otra transacción que aún no ha sido confirmada (committed).
- Non Repeatable read: Ocurre cuando una transacción lee la misma fila dos veces y obtiene un valor diferente cada vez.
- Phantom Read: Ocurre cuando se ejecutan dos consultas iguales, pero las filas recuperadas por ambas son diferentes.
Los cuatro niveles (Read Uncommitted, Read Committed, Repeatable Read y Serializable) equilibran el rendimiento y la precisión de los datos.
- Read Uncommited: Este es el nivel más bajo de aislamiento donde una transacción puede ver cambios no confirmados realizados por otras transacciones.
- Read Commited: Una transacción solo puede ver los cambios realizados por otras transacciones confirmadas.
- Repeatable Read: Una transacción verá los mismos datos durante toda su duración, incluso si otras transacciones realizan cambios en los datos.
- Serializable: Este es el nivel de aislamiento más alto, donde una transacción se ejecuta como si fuera la única transacción en el sistema.