NIVELES DE AISLAMIENTO DE TRANSACCIONES EN MYSQL

Los niveles de aislamiento de transacciones en MySQL definen cómo las transacciones interactúan entre sí y cómo se manejan los datos durante la ejecución de múltiples transacciones concurrentes. Estos niveles controlan la visibilidad de los cambios realizados por una transacción para otras transacciones, buscando un equilibrio entre consistencia de datos y rendimiento.
  • READ UNCOMMITTED (Lectura no confirmada): Este es el nivel de aislamiento más bajo. Una transacción puede leer datos que otra transacción ha modificado pero que aún no ha confirmado (commit). Esto significa que puedes leer datos "sucios", que podrían revertirse si la otra transacción hace un rollback.. Esto supone que se leen datos no confirmados que podrían deshacerse y noo recomendado para la mayoría de las aplicaciones debido al riesgo de inconsistencias. Por ejemplo si una transacción actualiza el saldo de una cuenta a 100 pero no hace commit, otra transacción podría leer ese valor de 100, aunque luego se revierta a su valor original. Rara vez se usa, solo en casos donde la consistencia no es crítica y se necesita alto rendimiento. "
  • READ COMMITTED (Lectura confirmada): Una transacción solo puede leer datos que han sido confirmados (commit) por otras transacciones. Evita los dirty reads, pero los datos pueden cambiar entre lecturas dentro de la misma transacción (non-repeatable reads). Poi ejemplo: Si se lees el saldo de una cuenta (100), otra transacción lo actualiza a 200 y lo confirma. Si se vuelve a leer el saldo en la misma transacción, ahora será 200. Su uso es adecuado para aplicaciones donde los dirty reads son inaceptables, pero se toleran cambios en los datos durante la transacción."
  • REPEATABLE READ (Lectura repetible): : Este es el nivel de aislamiento predeterminado en MySQL, para el motor InnoDB. Garantiza que si una transacción lee un registro, ese registro no cambiará en lecturas posteriores dentro de la misma transacción, incluso si otra transacción lo modifica y confirma. Sin embargo, no evita los phantom reads, es decir, que silos registros leídos no cambian, pueden aparecer nuevas filas (o desaparecer) en consultas repetidas si otra transacción inserta o elimina registros. Por ejemplo si se leen todas las cuentas con saldo mayor a 100. Otra transacción inserta una nueva cuenta que cumple ese criterio. Si se repite la consulta, se podráb ver la nueva cuenta (phantom read). Su uso es bueno para aplicaciones que necesitan lecturas consistentes de los mismos registros, pero toleran la aparición de nuevas filas."
  • SERIALIZABLE (Serializable): Este es el nivel de aislamiento más estricto. Las transacciones se ejecutan de manera que parecen ejecutarse una tras otra (en serie), aunque en realidad se ejecuten concurrentemente. Evita dirty reads, non-repeatable reads y phantom reads al bloquear los datos necesarios para garantizar total aislamiento. Puede causar bloqueos (locks) extensos, reduciendo la concurrencia y afectando el rendimiento. Por ejemplo si una transacción lee un rango de datos, ninguna otra transacción puede modificar, insertar o eliminar datos en ese rango hasta que la primera transacción termine. Su uso es Ideal para aplicaciones donde la consistencia absoluta es crítica, como sistemas financieros, pero puede ser lento en entornos con alta concurrencia."
El nivel de aislamiento en MySQL, se configura con el comando "SET TRANSACTION ISOLATION LEVEL [nivel];" o a nivel global con la variable transaction_isolation. InnoDB soporta todos estos niveles, pero el nivel predeterminado es REPEATABLE READ. La elección del nivel depende de las necesidades de tu aplicación: mayor consistencia implica menor rendimiento y viceversa.

Para avanzar más en el tema están los siguientes posts para saber más sobre transacciones en mysql: