Descripción de los niveles de aislamiento

Completado

Transacciones

Para comprender los niveles de aislamiento, primero debe comprender las transacciones. MySQL admite dos tipos de transacciones:

  • Confirmación automática. Cada instrucción SQL es una transacción y los cambios se confirman de inmediato. El parámetro de servidor es autocommit y está establecido en ON de forma predeterminada.
  • Explícita. El tipo explícito requiere que las transacciones comiencen con las palabras clave START TRANSACTION o BEGIN, y terminen con las palabras clave COMMIT o ROLLBACK. Las transacciones explícitas permiten confirmar o revertir un grupo de instrucciones juntas. No se pueden confirmar ni revertir parcialmente.

Conflictos

Cuando muchos clientes están conectados a la misma base de datos, aumenta la posibilidad de que intenten modificar y leer los mismos datos. Si más de un usuario está intentando modificar los datos al mismo tiempo, pueden surgir los siguientes problemas:

  • Lecturas de datos sucios: cuando un usuario lee datos que están en proceso de actualizarse por parte de otro usuario. El primer usuario lee los datos, mientras que el segundo usuario confirma su cambio en el disco y actualiza los datos. Ahora, el primer usuario tiene información obsoleta.
  • Actualizaciones perdidas: un usuario actualiza algunos datos, pero otro usuario reemplaza ese cambio. Los datos del primer usuario se pierden.
  • Lecturas no repetibles: cuando dos usuarios ejecutan la misma consulta en la base de datos, pero reciben información diferente porque otro usuario ha actualizado los datos. La instrucción SELECT ejecutada por los usuarios originales no es repetible, porque devuelve datos diferentes cuando se ejecuta.
  • Lecturas fantasma: se producen cuando se agregan o eliminan filas mientras una transacción está en curso. Cuando se vuelve a ejecutar la misma consulta, devuelve un número de filas diferente.

Niveles de aislamiento

Estos problemas se abordan estableciendo un nivel de aislamiento en el motor de almacenamiento o para la sesión. Los cuatro niveles de aislamiento son:

  • READ UNCOMMITTED: no se ponen bloqueos en los datos, lo que significa que puede haber "lecturas de datos sucios". Un usuario puede leer datos que está modificando otra persona, pero los datos modificados aún no se han confirmado en el disco.
  • READ COMMITTED: evita las lecturas de datos sucios haciendo que las modificaciones no confirmadas no estén visibles para otros usuarios. Solo los datos confirmados están disponibles para cada instrucción SELECT. No obstante, READ COMMITTED puede dar lugar a lecturas no repetibles cuando se ejecutan varias consultas dentro de la misma transacción. Esto significa que dos usuarios pueden seleccionar los mismos datos, pero obtener resultados diferentes. READ COMMITTED es el aislamiento predeterminado para otras bases de datos relacionales comunes, como SQL Server y PostgreSQL. No es el valor predeterminado para MySQL.
  • REPEATABLE READ: este es el nivel de aislamiento de transacciones predeterminado del motor de almacenamiento InnoDB. Garantiza lecturas coherentes dentro de la misma transacción porque se toma una instantánea de los datos y es la que se usa cuando se ejecuta la misma instrucción SELECT. Esto resuelve el problema de las lecturas no repetibles, pero puede afectar al rendimiento.
  • SERIALIZABLE: este nivel de aislamiento es el más restringido. Pone un bloqueo en cada fila y no permite que una transacción interfiera con otra. Un usuario no puede cambiar una fila seleccionada por una transacción hasta que la transacción ha finalizado. El nivel SERIALIZABLE garantiza que las lecturas de los datos sean siempre coherentes.

Puede ver o modificar el nivel de aislamiento predeterminado en los parámetros del servidor. transaction_isolation es el parámetro que define el nivel de aislamiento predeterminado.