sql >> Base de Datos >  >> RDS >> Mysql

transacciones paralelas en mysql

Todo depende del ISOLATION LEVEL has configurado.

Puede ver cuál ha establecido con esta consulta:

select @@global.tx_isolation, @@session.tx_isolation;

Antes de explicar los diferentes niveles de aislamiento, permítanme explicar qué problemas están tratando de evitar:

  • La lectura sucia :Los datos de una transacción aún no finalizada son leídos por otra transacción.

  • La actualización perdida :Dos transacciones modifican una entrada en una tabla en paralelo. Cuando ambas transacciones finalizan, solo se aplica una modificación.

  • La lectura no repetible :Las lecturas recurrentes conducen a resultados diferentes.

  • La lectura fantasma :Durante una transacción, otra transacción agrega o elimina entradas de la tabla.

Ahora para los diferentes niveles de aislamiento.

Lectura no confirmada :
Con este nivel de aislamiento, las operaciones de lectura ignoran cualquier tipo de bloqueo, por lo que puede ocurrir cualquiera de los problemas mencionados anteriormente.

Lectura confirmada :
Este nivel de aislamiento establece un bloqueo de escritura para toda la transacción en los objetos que deben modificarse. Los bloqueos de lectura solo se establecen cuando se leen datos. Por lo tanto, pueden ocurrir lecturas no repetibles y lecturas fantasma.

Lectura repetible :
Con este nivel de aislamiento se asegura que las operaciones de lectura recurrentes siempre den el mismo resultado cuando los parámetros son los mismos. Se establecen bloqueos para operaciones de lectura y escritura durante la duración total de la transacción. Por lo tanto, solo pueden ocurrir lecturas fantasma.

Serializable :
El nivel de aislamiento más alto garantiza que el resultado de las transacciones en ejecución paralelas es el mismo que si las transacciones se ejecutaran una tras otra. La mayoría de las bases de datos realmente no ejecutan esas transacciones una tras otra, sería una gran pérdida de rendimiento. Por lo tanto, puede suceder que se cancele una transacción. MySQL, por ejemplo, se da cuenta de esto con MVCC (Control de concurrencia de múltiples versiones). Googlealo, si quieres saber más. Es demasiado para esta respuesta.

En resumen, esta tabla también lo explica:

                 | Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible     | possible   | possible            | possible
Read Committed   | impossible   | impossible | possible            | possible
Repeatable Read  | impossible   | impossible | impossible          | possible
Serializable     | impossible   | impossible | impossible          | impossible
  • En esta entrada manual hay más información al respecto y cómo establecer el nivel de aislamiento.

Todo esto es solo teoría para los sistemas de gestión de bases de datos relacionales. Sin embargo, dado que MySQL usa MVCC (control de concurrencia de múltiples versiones), las lecturas fantasma no ocurren cuando se usa InnoDB y el nivel de aislamiento de lectura repetible .
De manual :