Nivel de aislamiento de transacciones Mysql y mecanismo de bloqueo

Nivel de aislamiento de transacciones Mysql y mecanismo de bloqueo

Visión de conjunto

Las bases de datos generalmente ejecutan múltiples transacciones al mismo tiempo. Varias transacciones pueden realizar simultáneamente operaciones CRUD en los mismos datos, lo que a veces conduce a problemas como lecturas sucias, escrituras sucias, lecturas no repetibles y lecturas fantasmas.
Para resolver el problema de la concurrencia de múltiples transacciones, la base de datos Mysql ha diseñado un mecanismo de aislamiento de transacciones, un mecanismo de bloqueo
y un mecanismo de aislamiento de control de concurrencia de múltiples versiones MVCC, utilizando un conjunto de mecanismos para resolver el problema de la concurrencia de múltiples transacciones.

Transacción y sus atributos ACID

La transacción tiene los siguientes cuatro atributos, generalmente denominados atributo ACID de la transacción.

Atomicidad (Atomicidad) : Una transacción es una unidad de operación atómica, la modificación de los datos se ejecuta o no se ejecuta.
Coherencia (coherente) : al principio y al final de la transacción, los datos deben estar en un estado coherente. Esto significa que todas las reglas de datos relevantes
deben aplicarse a las modificaciones de transacciones para mantener la integridad de los datos.
Aislamiento : el sistema de base de datos proporciona un cierto mecanismo de aislamiento para garantizar que las transacciones se ejecuten en un entorno "independiente" que no se vea afectado por operaciones concurrentes externas. Esto significa que el estado intermedio en el proceso de transacción es invisible para el exterior y viceversa.
Durable : una vez que se completa la transacción, su modificación a los datos es permanente y se puede mantener incluso si ocurre una falla del sistema.

Problemas causados ​​por el procesamiento de transacciones concurrentes

Actualización perdida o escritura sucia
Cuando dos o más transacciones seleccionan la misma fila de datos y luego actualizan la fila según el valor seleccionado inicialmente, debido a que cada transacción no conoce la existencia de otras transacciones, se producirá una pérdida Problema de actualización: la última actualización cubre las actualizaciones realizadas por otras empresas.
  
Lecturas sucias
  Una transacción está modificando un registro. Antes de que la transacción se complete y envíe, los datos de este registro se encuentran en un estado inconsistente; en este momento, otra transacción también lee el mismo registro, si no Con control, la segunda transacción lee estos datos "sucios" y realiza un
procesamiento adicional basado en esto , lo que resulta en dependencias de datos no comprometidas. Este fenómeno se denomina vívidamente "lectura sucia".
  En una palabra: la Transacción A lee los datos que la Transacción B ha modificado pero que aún no ha confirmado, y realiza operaciones con estos datos. En este momento, si la transacción B se revierte, los datos leídos por A no son válidos y no cumplen con los requisitos de coherencia.
  
No se puede volver a leer (lecturas no repetibles)
  una transacción en un momento determinado después de los datos leídos, leer los datos leídos previamente de nuevo, pero se encuentra que los datos leídos se han producido cambios de
variable o se han eliminado! Este fenómeno se denomina "lectura no repetible".
  Una oración: la misma instrucción de consulta en la transacción A lee resultados inconsistentes en diferentes momentos y no cumple con las
  
lecturas fantasmas de aislamiento (lecturas fantasmas).
  Una transacción lee datos recuperados previamente bajo las mismas condiciones de consulta, pero se encuentra que otras transacciones insertan Con datos nuevos que cumplen sus condiciones de consulta, este fenómeno se denomina "lectura fantasma".
  En una palabra: la transacción A lee los nuevos datos enviados por la transacción B, que no cumple con el nivel de aislamiento de la
  
transacción de aislamiento.
"Lectura sucia", "lectura no repetible" y "lectura fantasma" son en realidad problemas de coherencia de lectura de la base de datos, que deben ser La base de datos proporciona un cierto mecanismo de aislamiento de transacciones para resolverlo.
Inserte la descripción de la imagen aquíCuanto más estricto sea el aislamiento de transacciones de la base de datos, menores serán los efectos secundarios de la concurrencia, pero mayor será el costo, porque el aislamiento de transacciones esencialmente hace que las transacciones se "serialicen" hasta cierto punto, lo que obviamente es contradictorio con la "concurrencia". Al mismo tiempo, las distintas aplicaciones tienen diferentes requisitos de coherencia de lectura y aislamiento de transacciones. Por ejemplo, varias aplicaciones no son sensibles a la "lectura no repetible" y la "lectura fantasma", y pueden estar más preocupadas por la capacidad de acceso simultáneo a datos.
El nivel de aislamiento de transacciones de la base de datos actual: mostrar variables como 'x_isolation';
Establecer el nivel de aislamiento de transacciones: establecer tx_isolation = 'REPEATABLE-READ'; El
nivel de aislamiento de transacciones predeterminado de Mysql es de lectura repetible. Al desarrollar programas con Spring, si el nivel de aislamiento no está establecido El nivel de aislamiento establecido por Mysql se usa de forma predeterminada. Si se establece Spring, se usará el nivel de aislamiento establecido

Bloquear detalles

Un bloqueo es un mecanismo para que una computadora coordine múltiples procesos o subprocesos para acceder a un recurso al mismo tiempo. En una base de datos, además de la disputa por los recursos informáticos tradicionales (como CPU, RAM, E / S, etc.), los datos también son un recurso que los usuarios deben compartir. Cómo garantizar la coherencia y la eficacia del acceso concurrente a los datos es un problema que todas las bases de datos deben resolver, y los conflictos de bloqueo también son un factor importante que afecta el rendimiento del acceso concurrente a la base de datos.

Clasificación de bloqueo

  • En términos de rendimiento, se divide en bloqueo optimista (implementado por comparación de versiones) y bloqueo pesimista
  • De los tipos de operaciones de la base de datos, se divide en bloqueos de lectura y bloqueos de escritura (ambos pertenecen a bloqueos pesimistas).
    Bloqueos de lectura (bloqueos compartidos, bloqueos S (Compartidos)): Para los mismos datos, se pueden realizar múltiples operaciones de lectura al mismo tiempo sin el otro. Bloqueo de
    escritura de impacto (bloqueo exclusivo, bloqueo X (exclusivo)): antes de que se complete la operación de escritura actual, bloqueará otros bloqueos de escritura y lectura
  • A partir de la granularidad de las operaciones de datos, se divide en bloqueos de tabla y bloqueos de fila.

Bloqueo de mesa Bloquea
toda la mesa para cada operación. Baja sobrecarga, bloqueo rápido; sin interbloqueo; gran granularidad de bloqueo, la mayor probabilidad de conflictos de bloqueo y la menor concurrencia; generalmente se usa en escenarios donde se migra toda la tabla.

Operación básica

  • Aumente manualmente el bloqueo de tabla bloqueo de
    tabla nombre de tabla lectura (escritura), nombre de tabla 2 lectura (escritura);
  • Ver las cerraduras agregadas en la tabla
    mostrar tablas abiertas;
  • Eliminar tablas de
    desbloqueo de bloqueo de mesa;

análisis

  • Agregar bloqueo de lectura La
    sesión actual y otras sesiones pueden leer la tabla. Insertar o actualizar la tabla bloqueada en la sesión actual informará un error, mientras que la inserción o actualización de otras sesiones esperará
  • Agregar un bloqueo de escritura La
    sesión actual no tiene problemas para agregar , eliminar, modificar y verificar la tabla, y todas las operaciones en la tabla de otras sesiones están bloqueadas

Conclusión
1. Leer una tabla MyISAM (agregar un bloqueo de lectura) no impedirá que otros procesos lean solicitudes en la misma tabla, pero bloqueará la escritura de solicitudes en la misma tabla. Solo cuando se libera el bloqueo de lectura, se ejecutarán las operaciones de escritura de otros procesos.
2. La operación de escritura en la tabla MylSAM (bloqueo de escritura) impedirá que otros procesos lean y escriban la misma tabla. Solo cuando se libere el bloqueo de escritura, se realizarán las operaciones de lectura y escritura de otros procesos

Bloqueo de fila Bloquea una
fila de datos para cada operación. Alta sobrecarga y bloqueo lento; se producirá un interbloqueo; la granularidad de bloqueo más pequeña, la probabilidad más baja de conflictos de bloqueo y la concurrencia más alta.
Hay dos grandes diferencias entre InnoDB y MYISAM:

  • InnoDB admite transacciones (TRANSACCIÓN)
  • InnoDB admite bloqueos a nivel de fila

Escenario
Una sesión abre la actualización de la transacción y no se confirma, otra sesión actualiza el mismo registro se bloqueará, la actualización de diferentes registros no se bloqueará

para resumir:

MyISAM agregará automáticamente bloqueos de lectura a todas las tablas involucradas antes de ejecutar la instrucción de consulta SELECT, y agregará automáticamente bloqueos de escritura a las tablas involucradas en las operaciones de actualización, inserción y eliminación.

InnoDB no se bloqueará al ejecutar la instrucción de consulta SELECT (nivel de aislamiento no serial). Sin embargo, las operaciones de actualización, inserción y eliminación agregarán bloqueos de fila.

En resumen, los bloqueos de lectura bloquearán las escrituras, pero no las lecturas. El bloqueo de escritura bloqueará tanto la lectura como la escritura.

Lectura no confirmada : set tx_isolation = 'lectura no confirmada'
La transacción de B aún no se ha confirmado, A puede consultar los datos actualizados de B. Una vez que la transacción de B se deshaga por alguna razón, todas las operaciones se cancelarán. Los datos consultados por A son en realidad datos sucios

Lectura confirmada : set tx_isolation = 'read-commit'
A consulta todos los registros. Antes de enviar la transacción de A, abra B y actualice la tabla. La transacción de B aún no se ha enviado. A no puede consultar los datos actualizados de B, lo que resuelve el problema Problema de lectura, se envía la transacción de B, A ejecuta la misma consulta que el paso anterior y el resultado no es coherente con el paso anterior, es decir, se produce un problema de lectura no repetible

Lectura repetible : set tx_isolation = 'repetible-read'
A consulta todos los registros. Antes de enviar la transacción de A, abra B, actualice la tabla y envíela. Todos los registros de la tabla de consulta de A son coherentes con el resultado de la consulta anterior, no no repetible El problema de la lectura. Vuelva a abrir B, inserte un nuevo dato y envíelo. Consulte todos los registros de la tabla A, no se encuentran nuevos datos, por lo que parece que no hay lectura fantasma, pero los datos recién agregados se pueden actualizar correctamente ejecutando la actualización en A. Los nuevos datos de B se pueden encontrar consultando nuevamente, y hay un problema de lectura fantasma

Serialización : set tx_isolation = 'serializable'
Una consulta de todos los registros, abrir B, actualizar el mismo registro se bloqueará esperando, la actualización de diferentes registros puede ser exitosa, lo que indica que las consultas innodb en modo serial también estarán bloqueadas.
Si A ejecuta una consulta de rango, se bloquearán todas las filas del rango, incluido el rango de intervalo de espacio donde se encuentra cada registro de fila. En este momento, si B inserta datos en este rango, se bloqueará, por lo que se evitarán las lecturas fantasmas.
Este nivel de aislamiento tiene una simultaneidad extremadamente baja y rara vez se usa en desarrollo.

Gap Lock Gap Lock
bloquea el espacio entre dos valores. El nivel predeterminado de Mysql es de lectura repetible, no hay forma de resolver el problema de la lectura fantasma, el bloqueo de espacios puede resolver el problema de la lectura fantasma en algunos casos.
Rango: Se bloquearán todos los registros de línea incluidos en el rango (incluidos los registros de línea de espacio) y el espacio donde se encuentran los registros de línea (el lado derecho no incluye el lado izquierdo).
El bloqueo de espacio solo tendrá efecto bajo el nivel de aislamiento de lectura repetible.

Cerraduras de
siguiente llave Las cerraduras de siguiente llave son una combinación de cerradura de fila y cerradura de espacio (sin incluir el lado izquierdo).
 
Los bloqueos de fila no indexados se actualizarán a bloqueos de tabla. Los
bloqueos se agregan principalmente al índice. Si los campos no indexados se actualizan, los bloqueos de fila se convertirán en bloqueos de tabla.

Los bloqueos de fila InnoDB son bloqueos para índices, no para registros. Y el índice no se puede invalidar; de lo contrario, se actualizará de bloqueo de fila a bloqueo de tabla.

Para bloquear una fila, también puede usar el bloqueo en modo compartir (bloqueo compartido) y para actualizar (bloqueo exclusivo), por ejemplo: seleccione * de test_innodb_lock donde a = 2 para actualizar; de modo que otras sesiones solo puedan leer esta fila de datos, y la modificación será Bloquear hasta que se envíe la sesión de la fila bloqueada

Conclusión
Debido a que el motor de almacenamiento Innodb implementa el bloqueo a nivel de fila, aunque la pérdida de rendimiento causada por la implementación del mecanismo de bloqueo puede ser mayor que la del bloqueo a nivel de tabla, es muy superior a las tablas MYISAM en términos de capacidades generales de procesamiento concurrente. Nivel bloqueado. Cuando la concurrencia del sistema es alta, el rendimiento general de Innodb tendrá ventajas obvias en comparación con MYISAM.
Sin embargo, el bloqueo a nivel de fila de Innodb también tiene su lado frágil.Cuando lo usamos incorrectamente, el rendimiento general de Innodb puede ser peor.

Análisis de bloqueo de fila Analice
la contención de bloqueos de fila en el sistema comprobando la variable de estado InnoDB_row_lock

1 show status like 'innodb_row_lock%';

La descripción de cada cantidad de estado es la siguiente:
Innodb_row_lock_current_waits: el número de cerraduras que están esperando actualmente
Innodb_row_lock_time: la duración total del tiempo de bloqueo desde el inicio del sistema hasta el presente
Innodb_row_lock_time_avg: el tiempo promedio empleado en cada espera
Innodb_row_lock_time_max: el tiempo de espera más largo del sistema desde ahora Tiempo
Innodb_row_lock_waits: el número total de esperas desde que se inició el sistema hasta ahora.
Para estas 5 variables de estado, las más importantes son:
Innodb_row_lock_time_avg (tiempo promedio de espera)
Innodb_row_lock_waits (número total de esperas)
Innodb_row_lock_time (tiempo total de espera)
especialmente cuando el número de esperas es alto Y cada vez que el tiempo de espera no sea pequeño, debemos analizar por qué hay tantos esperando en el sistema,
y luego proceder a formular un plan de optimización basado en los resultados del análisis.

Ver la hoja de datos relacionada del bloqueo de la biblioteca del sistema INFORMATION_SCHEMA

1 ‐‐ 查看事务
2 select * from INFORMATION_SCHEMA.INNODB_TRX;
3 ‐‐ 查看锁
4 select * from INFORMATION_SCHEMA.INNODB_LOCKS;
5 ‐‐ 查看锁等待
6 select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
7
8 ‐‐ 释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到
9 kill trx_mysql_thread_id
10
11 ‐‐ 查看锁等待详细信息
12 show engine innodb status\G;

Punto muerto

set tx_isolation = 'repetible-read';
Ejecución de Session_1: seleccione * de la tabla donde id = 1 para actualización;
Ejecución de Session_2: seleccione * de la tabla donde id = 2 para actualización;
Ejecución de Session_1: seleccione * de la tabla donde id = 2 para actualización ;
Ejecución de Session_2: seleccione * de la tabla donde id = 1 para actualizar;
vea la información de registro de interbloqueo reciente: muestre el estado del innodb del motor \ G; en la
mayoría de los casos, mysql puede detectar automáticamente el interbloqueo y revertir la transacción que causó el interbloqueo, pero algunos Situación MySQL no puede detectar automáticamente un punto muerto

Bloquear sugerencias de optimización

  • En la medida de lo posible, toda la recuperación de datos se completa a través del índice, para evitar la actualización de bloqueos de fila no indexados a bloqueos de tabla.
  • Diseñe el índice de manera razonable para minimizar el alcance del candado
  • Minimice el alcance de las condiciones de búsqueda para evitar bloqueos de espacios
  • Intente controlar el tamaño de la transacción, reduzca la cantidad de recursos bloqueados y el tiempo, e intente ejecutar el SQL que implica el bloqueo de la transacción al final de la transacción.
  • Es posible el aislamiento de transacciones de bajo nivel

Supongo que te gusta

Origin blog.csdn.net/weixin_51049616/article/details/108766791
Recomendado
Clasificación