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
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
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
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
Desbloquear la mesa:
Paso 1: encuentra la mesa bloqueada
mostrar lista de procesos
Paso 2: elimine el proceso que elimina la tabla bloqueada
kill 21;
kill 22;
Actualizar de nuevo los datos de la tabla de usuario
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
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.
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).