MySQL | Mecanismo de bloqueo en MySQL (detallado)

Uno, motor de almacenamiento

  1. InnoDB Admite transacciones, admite bloqueos de filas, admite claves externas (por lo general, no establece claves externas para mantener la coherencia de los datos en el programa), motores de almacenamiento convencionales y un mayor rendimiento de procesamiento simultáneo.
  2. MyIsam No admite transacciones, admite indexación de texto completo, admite bloqueos de tablas, no admite claves externas y es rápido de verificar y cambiar. Se ha abandonado en la última versión de MYSQL.
  3. Memory Los datos cambian con frecuencia, no se requiere almacenamiento y la verificación y corrección son extremadamente rápidas.

La base de datos MySQL ingresando al show engines;motor de almacenamiento de visualización, mi versión es MySQL5.7
Inserte la descripción de la imagen aquí

Dos, clasificación de bloqueo MySQL

  1. 表级锁: Baja sobrecarga, bloqueo rápido; sin interbloqueo; gran granularidad de bloqueo, la mayor probabilidad de conflictos de bloqueo y la menor concurrencia.
  2. 行级锁: Sobrecarga alta, 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.
  3. 页面锁: El tiempo de sobrecarga y bloqueo se produce entre los bloqueos de la tabla y los bloqueos de las filas; se producirán interbloqueos; la granularidad de bloqueo se produce entre los bloqueos de la tabla y los bloqueos de las filas, y la simultaneidad es media.

Tres, procesamiento de transacciones

  1. La transacción A ejecuta el siguiente código pero no se confirma,
BEGIN;
UPDATE stu SET sname = '小明' WHERE id=1;
  1. La transacción B ejecuta el siguiente código y se puede ejecutar normalmente
BEGIN;
update stu set sname = '小红' where id=3
COMMIT;
  1. Pero la transacción B actualiza el mismo registro que la transacción A no puede operar, el proceso de ejecución está bloqueado
BEGIN;
UPDATE stu SET sname = '小刚' WHERE id=1;
...
  1. Cuando A se ejecuta y se COMMITconfirma, la línea de registro se desbloquea. En este momento, la transacción B continúa ejecutándose

1. Bloqueo sin índice

Cuando se utilizan campos no indexados para filtrar, se producirán bloqueos completos de la tabla, es decir, bloqueos a nivel de tabla, situación que debe evitarse para mejorar el rendimiento concurrente de la base de datos.

  1. La transacción A ejecuta el siguiente código, porque el campo sname no agrega un índice, lo que hace que toda la tabla se bloquee
BEGIN;
UPDATE stu SET sname = '小红' WHERE sname ='小明';
  1. Ahora la transacción B actualiza cualquier registro causará bloqueo, porque ahora está en el estado de bloqueo de tabla
BEGIN;
update stu set sname = '小明' where id=1
-- 阻塞中...

2. Bloqueo de rango

Una gran cantidad de registros se bloquean cuando la consulta no especifica un rango claro

  1. La transacción A usa un intervalo de rango al filtrar, lo que provocará bloqueos de tabla
BEGIN;
UPDATE goods SET num=100 WHERE id>1 AND id<3; 
  1. La transacción B no podrá modificar registros con ID mayor que 2 en la tabla
BEGIN;
update goods set num =1 where id=2;
-- 阻塞中...

Pero puede cambiar el registro con ID 1

update goods set num =1 where id=1;
  1. Al realizar la suma, se puede agregar porque no está en el rango de ID 1 ~ 3, pero si la ID se especifica como 2 al agregar, se bloqueará.
insert into goods (name,num) values('冰箱',200);

Cuatro, cerradura pesimista

El bloqueo no observable se refiere a una actitud conservadora hacia la modificación de los datos por parte del mundo exterior.Durante todo el proceso de procesamiento de datos, mantener los datos en un estado bloqueado puede resolver el problema de la pérdida de actualización de las transacciones concurrentes.

  1. Después de que la transacción A realiza una operación de bloqueo pesimista, otras transacciones se bloquearán al ejecutar el mismo código
BEGIN;
SELECT * FROM goods WHERE id=1 FOR UPDATE;
UPDATE goods SET num=num-2 WHERE id=1; 
...
  1. La transacción B no podrá consultar el inventario al ejecutar el siguiente código y debe esperar a que la transacción A envíe o revierte la transacción.
BEGIN;
SELECT * FROM goods WHERE id=1 FOR UPDATE;
-- 阻塞中...
  1. Después de enviar la transacción A, la transacción B obtendrá el resultado de la operación de la transacción A

Cinco, cerradura optimista

Cada vez que voy a obtener los datos, creo que otros no los modificarán y no bloquearán los datos, pero al enviar la actualización, se juzgará si los datos se han modificado durante este período. Si se cambia, el envío fallará.

  1. La transacción A consulta el inventario del producto y obtiene el registro del producto. Hay un campo VERSIÓN en el registro para registrar el número de versión (actualmente 0)
BEGIN;
SELECT * FROM goods WHERE id = 1;
  1. Transacción B consultada al mismo tiempo, y también obtuvo el registro con el número de versión 0
BEGIN;
SELECT * FROM goods WHERE id = 1;
  1. La transacción A cambia el inventario y aumenta el número de versión
UPDATE goods SET num=num-10,VERSION =VERSION+1 WHERE VERSION=0;
  1. La transacción B cambia los datos, pero usa la versión 0 consultada por la transacción B. Debido a que la transacción A ha asignado el número de versión a 1, la modificación de la transacción B falla, lo que asegura la integridad de los datos.
UPDATE goods SET num=num-10,VERSION =VERSION+1 WHERE VERSION=0;

Seis, mecanismo de bloqueo de mesa

Para algunos motores de procesamiento que no admiten transacciones, puede utilizar tablas de bloqueo para controlar los servicios.

# Leer bloqueo

1. Leer bloqueo

Después de establecer un bloqueo de lectura para la tabla, ni la sesión actual ni otras sesiones pueden modificar los datos.

  1. La sesión A establece un bloqueo de lectura en los productos de la mesa y no puede modificar la mesa ni operar otras mesas.
LOCK TABLE goods READ;
UPDATE goods SET num=300 WHERE id=1;
SELECT * FROM stu;
  1. Debido a que la sesión A establece un bloqueo de lectura en los productos de mesa, la sesión B tampoco se puede modificar
update goods set num=200 where id=1;
-- 阻塞
  1. Después de que la sesión A desbloquea la mesa, otras sesiones pueden continuar operando la mesa

2. Bloqueo de escritura

Una vez que se establece el bloqueo de escritura para la tabla, la sesión actual se puede modificar y la tabla de consulta se deshabilitará para otras sesiones.

  1. La sesión A establece un bloqueo de escritura en los productos de la mesa, esta sesión puede operar la mesa normalmente, pero no puede operar otras mesas
LOCK TABLE goods WRITE;
INSERT INTO goods (name,num )VALUES('java',300);
  1. La sesión B bloqueará la lectura / escritura / escritura de datos de la tabla.
select * from goods
  1. Después de que la sesión A desbloquea los datos de la tabla, otras sesiones pueden funcionar normalmente
UNLOCK TABLES;

Supongo que te gusta

Origin blog.csdn.net/y1534414425/article/details/106167538
Recomendado
Clasificación