Un artículo para entender los bloqueos de MySQL

1 Introducción a los bloqueos de MySQL

1.1 ¿Qué es un candado?

Un bloqueo es un mecanismo utilizado por una computadora para coordinar el acceso simultáneo al mismo recurso compartido entre múltiples procesos. Para garantizar la consistencia y validez del acceso a los datos y otras funciones en MySQL, se implementa un mecanismo de bloqueo.Los bloqueos en MySQL se implementan en la capa del servidor o en la capa del motor de almacenamiento.

1.2 ¿Qué problemas se utilizan para resolver los bloqueos?

Los bloqueos se utilizan para resolver los problemas de acceso de transacciones concurrentes.Ya conocemos los diversos problemas que pueden surgir cuando las transacciones se ejecutan concurrentemente.La mayor dificultad es: por un lado, debemos maximizar el uso del acceso concurrente a la base de datos; por otro lado, debemos asegurarnos de que cada usuario pueda leer y modificar datos de manera consistente, especialmente si una transacción está realizando la operación de lectura y otra está realizando la operación de modificación al mismo tiempo.

Una transacción realiza una operación de lectura y la otra realiza una operación de modificación.Como dijimos anteriormente, en este caso pueden ocurrir problemas como lecturas sucias, lecturas no repetibles y lecturas fantasma.

¿Cómo resolver los problemas de lecturas sucias, lecturas no repetibles y lecturas fantasma? En realidad, hay dos posibles soluciones:

Opción 1: MVCC para operaciones de lectura y bloqueo para operaciones de escritura

Esta solución tiene un mejor rendimiento, pero puede leer registros de versiones anteriores

Solución 2: bloquee las operaciones de lectura y escritura

El rendimiento de esta solución es promedio, pero los últimos registros se pueden leer cada vez.Por ejemplo, en escenarios bancarios, los requisitos de seguridad son muy altos.

2 Clasificación de cerraduras

Hay muchos bloqueos en MySQL, que se pueden dividir en los siguientes tipos según el modo y la granularidad

imagen-20221003154244472

3 Bloqueo optimista y pesimista

3.1 Cerradura optimista

1. Concepto

El bloqueo optimista, como sugiere el nombre, es muy optimista. El bloqueo optimista cree que los datos no causarán conflictos en circunstancias normales, por lo que se detectará cuando los datos se envíen para su actualización.

2. Date cuenta

El bloqueo optimista se implementa mediante el mecanismo básico del número de versión. Se agrega un campo de versión a la tabla de datos y la versión se lee en conjunto cuando se leen los datos. Cada vez que se actualizan los datos, el valor del campo versión + 1. Cuando sea necesario enviar la modificación, compare el número de versión al momento de la lectura con el número de versión actual de la base de datos. Si es consistente, significa que nadie ha modificado este registro durante este período. Si es inconsistente, es significa que ha sido modificado y el envío falla.

3. Escenarios aplicables

El bloqueo optimista es adecuado para escenarios con muchas operaciones de lectura y pocas operaciones de escritura

3.2 Bloqueo pesimista

1. Concepto

El bloqueo pesimista es más pesimista que el bloqueo optimista. El bloqueo pesimista cree que los datos se modificarán cada vez que se opere, por lo que agregará un bloqueo cada vez que opere datos.

2. Date cuenta

Los bloqueos pesimistas se implementan a través de bloqueos compartidos y bloqueos exclusivos (estos dos bloqueos se analizarán a continuación)

3. Escenarios aplicables

Aplicable a escenarios con baja simultaneidad, muchas operaciones de escritura y pocas operaciones de lectura

4 candados exclusivos compartidos

4.1 Bloqueo compartido

1. Concepto

Bloqueo compartido, también conocido como bloqueo de lectura, denominado bloqueo S. Cuando una transacción agrega un bloqueo de lectura a los datos, otras transacciones solo pueden agregar un bloqueo de lectura a los datos, no un bloqueo de escritura.

2. Date cuenta

Método de bloqueo de bloqueo compartido: seleccione ...bloquear en modo compartido

imagen-20221003172941494

imagen-20221003173149274

4.2 Bloqueo exclusivo

1. Concepto

Bloqueo exclusivo, también conocido como bloqueo de escritura, bloqueo X para abreviar, cuando una transacción agrega un bloqueo exclusivo a los datos, otras transacciones no pueden consultar ni modificar los datos.

El motor MySQL InnoDB predeterminado para actualizar, eliminar e insertar agregará automáticamente un bloqueo exclusivo a los datos involucrados, y la declaración de selección no agregará ningún tipo de bloqueo de forma predeterminada.

2. Date cuenta

Método de bloqueo de bloqueo exclusivo: seleccione... para actualizar

imagen-20221003173825780

imagen-20221003173942828

5 cerraduras granulares

5.1 Bloqueo global

1. Concepto

Bloqueo global, como puede entender por el nombre, un bloqueo global bloquea toda la instancia de la base de datos MySQL.Durante el período de bloqueo, no se puede realizar ninguna adición, eliminación o modificación de la base de datos.

2. Date cuenta

MySQL proporciona una forma de agregar un bloqueo de lectura global, el comando esFlush tables with read lock (FTWRL)

3. Escenarios aplicables

Copia de seguridad completa de la base de datos, puede usar el bloqueo global, no lo use en otros casos

5.2 Cerraduras a nivel de mesa

1. Concepto

Bloqueo a nivel de tabla, bloquee la tabla que se está operando actualmente, los motores MyISAM e InnoDB admiten el bloqueo a nivel de tabla

Hay dos tipos de bloqueos de nivel de tabla en MySQL: uno es un bloqueo de tabla y el otro es un bloqueo de metadatos (bloqueo de metadatos, MDL)

2. Date cuenta

Agregar bloqueo de tabla: bloquear lectura/escritura de tabla

imagen-20221003175254955

imagen-20221003175706554

Desbloquear la mesa:

Paso 1: encuentra la mesa bloqueada

mostrar lista de procesos

imagen-20221003180108421

Paso 2: elimine el proceso que elimina la tabla bloqueada

kill 21;
kill 22;

Actualizar de nuevo los datos de la tabla de usuario

imagen-20221003180453415

Se puede actualizar normalmente

5.3 Bloqueos a nivel de página

El bloqueo a nivel de página es un tipo de bloqueo en MySQL cuya granularidad de bloqueo se encuentra entre el bloqueo a nivel de fila y el bloqueo a nivel de tabla. Los bloqueos de nivel de tabla son rápidos, pero tienen más conflictos, y los bloqueos de nivel de fila tienen menos conflictos, pero son más lentos. Por lo tanto, se adopta un bloqueo de nivel de página comprometido para bloquear un grupo de registros adyacentes a la vez. El motor BDB admite bloqueos a nivel de página

5.4 Bloqueos a nivel de fila

1. Concepto

Los bloqueos de nivel de fila son los bloqueos más detallados en MySQL, con la probabilidad más baja de conflictos de bloqueo, pero el bloqueo es lento y costoso.

Solo el motor InnoDB admite bloqueos de fila en MySQL, y otros no.

2. Date cuenta

En MySQL, los bloqueos a nivel de fila no son registros de interbloqueo, sino índices de bloqueo. MySQL agregará automáticamente bloqueos de fila al ejecutar declaraciones de actualización y eliminación

imagen-20221003181021358

imagen-20221003181133774

6 intento de bloqueo

1. Concepto

Los bloqueos de intención son bloqueos de tabla. Para coordinar la relación entre los bloqueos de fila y los bloqueos de tabla, coexisten bloqueos de granularidad múltiple (bloqueos de tabla y bloqueos de fila).

2. Función

Cuando hay un bloqueo de fila en la transacción A, MySQL agregará automáticamente un bloqueo de intención a la tabla. Si la transacción B desea solicitar un bloqueo de escritura en toda la tabla, no necesita recorrer cada fila para determinar si hay un bloqueo de intento. Bloqueo de fila, pero juzgue directamente si hay un bloqueo de intención. Mejore el rendimiento.

3. Compatibilidad

Bloqueo compartido de intención (IS) Bloqueo exclusivo de intención (IX)
candado compartido compatible mutuamente excluyentes
candado exclusivo mutuamente excluyentes mutuamente excluyentes

Bloqueo de registro de llave 7 Gap Pro

1. Concepto

Los bloqueos de registros, los bloqueos de espacios y los bloqueos de teclas adyacentes son todos bloqueos exclusivos, y el uso de bloqueos de registros es consistente con la introducción de bloqueos exclusivos.

7.1 Bloqueos de registro

Un bloqueo de registro es un registro bloqueado y un bloqueo de registro también se denomina bloqueo de fila, por ejemplo:

select * from user where id = 1 for update;

Agregará un bloqueo de registro en el registro con id=1 para evitar que otras transacciones inserten, actualicen y eliminen la fila con id=1.

7.2 Bloqueo de espacios

Los bloqueos de espacios se basan en índices no únicos, que bloquean un rango de registros de índice. Gap lock se usa para bloquear un intervalo, no solo cada pieza de datos en este intervalo

select * from user where id < 10 for update;

Es decir, se bloquearán todas las filas de registros en el intervalo [1, 10] y se bloqueará la inserción de todas las filas de datos con ID de 1, 2, 3, 4, 5, 6, 7, 8 y 9.

imagen-20221003182325290

imagen-20221003182340884

7.3 Bloqueo de teclas profesional

El bloqueo de teclas de proximidad es una combinación de bloqueo de registros y bloqueo de intervalos. Su rango de bloqueo incluye tanto registros de índice como intervalos de índice, que es un intervalo abierto a la izquierda y cerrado a la derecha. El objetivo principal del bloqueo de teclas es también evitar lecturas fantasma (Phantom Read). Si el nivel de aislamiento de la transacción se degrada a RC, el bloqueo de teclas también fallará.

Habrá un bloqueo de clave temporal en la columna de índice no único en cada fila de datos. Cuando una transacción mantiene el bloqueo de clave temporal de la fila de datos, bloqueará una sección de datos en el intervalo de apertura a la izquierda y cierre a la derecha. Debe enfatizarse que los bloqueos de nivel de fila en InnoDB se implementan en función de los índices, y los bloqueos de clave temporales solo están relacionados con columnas de índice no únicas, y los bloqueos de clave temporales no existen en columnas de índice únicas (incluidas las columnas de clave principal).

Supongo que te gusta

Origin blog.csdn.net/wgzblog/article/details/127281354
Recomendado
Clasificación