(Turno) Comprensión profunda del nivel de aislamiento de MySQL

Transferencia desde: https://www.jianshu.com/p/8d735db9c2c0

Qué es una transacción

Una transacción es una serie de operaciones estrictas en una aplicación. Todas las operaciones deben completarse con éxito; de lo contrario, se cancelarán todos los cambios en cada operación, es decir, la transacción es atómica y una serie de operaciones en una transacción son todas exitosas o no se realizan en absoluto.

Hay dos tipos de terminaciones de transacciones: cuando todos los pasos de la transacción se ejecutan correctamente, la transacción se confirma. Si uno de los pasos falla, se producirá una operación de reversión, deshaciendo todas las operaciones desde antes hasta el comienzo de la transacción.

ÁCIDO de la transacción

Las transacciones tienen cuatro características: atomicidad, consistencia, aislamiento y durabilidad. Estas cuatro características se conocen como características ACID para abreviar.

Atomicidad: Una transacción es la unidad lógica de trabajo de la base de datos, todas las operaciones contenidas en la transacción se realizan o no.

Coherencia: el resultado de la ejecución de la transacción debe ser cambiar la base de datos de un estado coherente a otro estado coherente. Por lo tanto, cuando la base de datos solo contiene los resultados del envío de transacciones exitosas, se dice que la base de datos está en un estado consistente.

Aislamiento: no hay interferencia entre una transacción y otras transacciones.

Persistencia: una vez que se confirma una transacción, sus cambios en los datos de la base de datos deben ser permanentes. Las siguientes operaciones o fallas no deberían tener ningún impacto en otros resultados de ejecución.

Los cuatro niveles de aislamiento de Mysql

El estándar SQL define 4 tipos de niveles de aislamiento, incluidas algunas reglas y reglas específicas para limitar qué cambios dentro y fuera de la transacción son visibles y cuáles son invisibles. Los niveles de aislamiento de bajo nivel generalmente admiten un procesamiento simultáneo más alto
y tienen una sobrecarga del sistema más baja.

Leer no comprometido (leer contenido no comprometido)

En este nivel de aislamiento, todas las transacciones pueden ver los resultados de ejecución de otras transacciones no comprometidas. Este nivel de aislamiento rara vez se utiliza para implementar aplicaciones, porque su rendimiento no es mucho mejor que otros niveles. La lectura de datos no confirmados también se denomina lectura sucia.

Leer comprometido (leer contenido enviado)

Este es el nivel de aislamiento predeterminado de la mayoría de los sistemas de bases de datos (pero no el predeterminado de mysql). Satisface la definición simple de aislamiento: una transacción solo puede ver los cambios realizados por la transacción comprometida. Este nivel de aislamiento también admite la llamada lectura no repetible, porque otras instancias de la misma transacción pueden tener nuevas confirmaciones durante el procesamiento de la instancia, por lo que la misma selección puede devolver resultados diferentes.

Lectura repetible

Este es el nivel de aislamiento de transacciones predeterminado de MySQL, que asegura que varias instancias de la misma transacción verán las mismas filas de datos al leer datos al mismo tiempo. Pero, en teoría, esto conduce a otro problema complicado, la lectura fantasma. En pocas palabras, una lectura fantasma significa que cuando el usuario lee un cierto rango de filas de datos, otra transacción inserta una nueva fila en el rango, y cuando el usuario lee un cierto rango de filas de datos, otra transacción está en el mismo rango. Se inserta una nueva fila en el rango. Cuando el usuario vuelva a leer la fila de datos en el rango, se encontrará una nueva fila fantasma.

Serializable (serializable)

Este es el nivel de aislamiento más alto. Resuelve el problema de lectura fantasma al forzar las transacciones para que sea imposible entrar en conflicto entre sí. En resumen, es agregar un bloqueo compartido a cada fila de datos leídos. Esto varias veces puede dar lugar a muchos tiempos de espera y bloqueo de contención.

Estos cuatro niveles de aislamiento se implementan utilizando diferentes tipos de bloqueo. Si se leen los mismos datos, es probable que ocurran problemas, como:

Lectura sucia: una transacción ha actualizado un dato y otra transacción lee el mismo dato en este momento. Por algunas razones, se realizó la operación RollBack anterior y los datos leídos por la siguiente transacción serán incorrectos de.

Lectura no repetible: Los datos son inconsistentes en las dos consultas de una transacción. Estos pueden ser los datos originales actualizados por una transacción insertada entre las dos consultas.

Lectura fantasma: los datos son inconsistentes en las dos consultas de una transacción. Por ejemplo, una transacción consulta varias columnas de datos, mientras que otra transacción inserta nuevas columnas de datos en este momento. La transacción anterior está en la siguiente consulta. Hay varias columnas de datos que no se han consultado. Si inserta datos en este momento y otra transacción inserta, se informará un error.
Inserte la descripción de la imagen aquí

Pruebe el nivel de aislamiento de Mysql

A continuación, utilizaremos el programa cliente MYSQL para probar estos niveles de aislamiento La
base de datos de prueba es una demostración y la estructura de la tabla: los
Inserte la descripción de la imagen aquí
dos clientes de la línea de comandos son A y B respectivamente. Cambie constantemente el nivel de aislamiento de A, modifique los datos en el lado B

Establecer el nivel de aislamiento de A para leer sin confirmar (leer sin confirmar)

Inserte la descripción de la imagen aquí

A: Inicie la transacción, los datos están en el estado inicial en este momento
Inserte la descripción de la imagen aquí
B: Inicie la transacción, actualice los datos, pero no los envíe
Inserte la descripción de la imagen aquí
A: Lea los datos nuevamente, descubra que los datos han sido modificados, esta es la llamada "lectura sucia"
Inserte la descripción de la imagen aquí
B: Revertir la transacción
Inserte la descripción de la imagen aquí
A : Lea los datos nuevamente y descubra que los datos han vuelto al estado inicial.
Inserte la descripción de la imagen aquí
Después del experimento anterior, se puede concluir que la transacción B actualizó un registro pero no se envió. En este momento, la transacción A puede consultar los registros no confirmados. Causa un fenómeno de lectura sucia. La lectura no confirmada es el nivel de aislamiento más bajo.

Establezca el nivel de aislamiento de la transacción del cliente A para leer comprometido (leer comprometido)

Inserte la descripción de la imagen aquí
A: Inicie la transacción, los datos están en el estado inicial en este momento
Inserte la descripción de la imagen aquí
B: Inicie la transacción, actualice los datos, pero no envíe
Inserte la descripción de la imagen aquí
A: Lea los datos nuevamente, descubra que los datos no se han modificado
Inserte la descripción de la imagen aquí
B: Envíe la transacción
Inserte la descripción de la imagen aquí
A: Lea los datos nuevamente, descubra que los datos han cambiado, Explique que la modificación enviada por B fue leída por A en la transacción. Esta es la llamada "lectura no repetible".
Inserte la descripción de la imagen aquí
Después del experimento anterior, se puede concluir que el nivel de aislamiento de lectura enviado resuelve el problema de las lecturas sucias, pero hay lecturas no repetibles. El problema es que los datos de la transacción A son inconsistentes en las dos consultas, porque la transacción B actualizó una parte de los datos entre las dos consultas. La lectura enviada solo puede leer los registros enviados, pero no es necesario leerlos repetidamente.

Establezca el nivel de aislamiento de A en lectura repetible (lectura repetible)

Inserte la descripción de la imagen aquí
A: Inicie la transacción, los datos están en el estado inicial en este momento
Inserte la descripción de la imagen aquí
B: Inicie la transacción, actualice los datos, pero no los envíe
Inserte la descripción de la imagen aquí
A: Lea los datos nuevamente, descubra que los datos no se han modificado
Inserte la descripción de la imagen aquí
B: Envíe la transacción
Inserte la descripción de la imagen aquí
A: Lea los datos nuevamente, descubra que los datos aún no se han producido Cambiar, lo que significa que esta vez puede leer
Inserte la descripción de la imagen aquí
B: inserte un nuevo dato y envíe
Inserte la descripción de la imagen aquí
A: vuelva a leer los datos, encuentre que los datos aún no han cambiado, aunque puede repetir la lectura, pero descubrió que la lectura no es la última información, esto Es la llamada "lectura fantasma"
Inserte la descripción de la imagen aquí
A: Envíe esta transacción, lea los datos nuevamente y descubra que la lectura es normal
Inserte la descripción de la imagen aquí

Establezca el nivel de aislamiento de A en serializable (serializable)

Inserte la descripción de la imagen aquí
R: Inicie la transacción, los datos son el estado inicial en este momento

Inserte la descripción de la imagen aquí
B: Se encuentra que B ha entrado en estado de espera en este momento, porque la transacción de A aún no se ha enviado y solo puede esperar (en este momento, B puede tener un tiempo de espera)
Inserte la descripción de la imagen aquí
A: Enviar la transacción
Inserte la descripción de la imagen aquí
B: Se encuentra que la inserción es exitosa y el
Inserte la descripción de la imagen aquí
serializable bloquea completamente el campo, si es que La transacción para consultar los mismos datos debe esperar hasta que se complete y desbloquee la transacción anterior. Es un nivel de aislamiento completo, y la tabla de datos correspondiente estará bloqueada, por lo que habrá problemas de eficiencia.

Supongo que te gusta

Origin blog.csdn.net/weixin_46011971/article/details/108913646
Recomendado
Clasificación