Mecanismo de bloqueo de MySQL (bloqueo de tabla y bloqueo de fila)


Definición de bloqueo

Un bloqueo es un mecanismo para que una computadora coordine múltiples procesos o subprocesos para acceder simultáneamente a un determinado recurso.

  • En la 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 compartido. Cómo garantizar la coherencia y la eficacia del acceso simultáneo a los datos es una necesidad para todas las bases de datos .problema.
  • El conflicto de bloqueos es un factor importante que afecta el rendimiento del acceso concurrente a la base de datos, desde esta perspectiva, los bloqueos son particularmente importantes para la base de datos y también es más complicado.

Clasificación de cerraduras

A partir del tipo de operación de los datos se divide en: un bloqueo de lectura (bloqueo compartido) y un bloqueo de escritura (bloqueo exclusivo)

Bloqueo de lectura : para el mismo dato, la operación de lectura de los datos se puede realizar al mismo tiempo sin verse afectada.

Bloqueo de escritura : antes de que se complete la operación de escritura, se bloquearán otras operaciones de lectura y escritura.

La operación se divide en un tamaño de partícula de datos: un bloqueo de tabla y un bloqueo de fila


Bloqueo de mesa

Funciones de bloqueo de mesa

  • MylSAM引擎El uso de bloqueos de mesa tiene una sobrecarga baja, bloqueo rápido, sin interbloqueos, alta resistencia de bloqueo y la mayor probabilidad de conflictos de bloqueo.
  • Simultaneidad más baja
  • No admite transacciones

Datos de simulación

create table mylock (
id int not null primary key auto_increment,
name varchar(20) default ''
) engine myisam;

insert into mylock(name) values('a');
insert into mylock(name) values('b');
insert into mylock(name) values('c');
insert into mylock(name) values('d');
insert into mylock(name) values('e');

select * from mylock;

Ver bloqueo de la base de datos

SHOW OPEN TABLES in hanyxx; --查看数据库hanyxx中的表是否加锁
LOCK TABLE book read , phone write -- book表加读锁,phone表加写锁
--全部解锁
UNLOCK TABLES;

Bloqueo de mesa (bloqueo de lectura)

El anfitrión A agrega un bloqueo de mesa (bloqueo de lectura) a la mesa

  • Tanto el host A como otros hosts pueden leer la información de la tabla
  • El host A no puede leer la información de otras tablas, pero otros hosts pueden leer la información de otras tablas en la biblioteca
  • El anfitrión A no puede modificar la mesa bloqueada
  • Otros hosts modifican la tabla y se bloquearán hasta que se libere el bloqueo de la tabla (bloqueo de lectura)

Bloqueo de mesa (bloqueo de escritura)

El anfitrión A agrega un bloqueo de tabla (bloqueo de escritura) a la tabla

  • El host A puede leer la información de la tabla, pero cuando otros hosts la lean, entrará en un estado de bloqueo hasta que se libere el bloqueo de la tabla (bloqueo de escritura).
  • El host A no puede leer la información de otras tablas, pero otros hosts no pueden leer la información de esta tabla, pero pueden leer la información de otras tablas
  • El anfitrión A puede modificar la tabla
  • Otros hosts no pueden modificar la tabla y se bloquearán hasta que se libere el bloqueo de la tabla (bloqueo de escritura)

para resumir

Inserte la descripción de la imagen aquí

El bloqueo de lectura no bloquea las lecturas, solo las escrituras. Pero el bloqueo de escritura bloqueará la lectura y la escritura.


Análisis de bloqueo de tabla

Inserte la descripción de la imagen aquí

Bloqueo de fila (énfasis)

Características de bloqueo de filas

  • Sobrecarga alta, grilletes lentos, puntos muertos
  • La menor granularidad de bloqueo, la menor probabilidad de conflictos de bloqueo y el mayor grado de simultaneidad

La mayor diferencia entre InnoDB y MyISAM

  • Asuntos de soporte
  • Usar bloqueo de fila
    Inserte la descripción de la imagen aquí

Problemas causados ​​por transacciones concurrentes

  • Lectura sucia
    Inserte la descripción de la imagen aquí
  • No repetible
    Inserte la descripción de la imagen aquí
  • Lectura fantasma
    Inserte la descripción de la imagen aquí

Nivel de aislamiento de transacciones

Inserte la descripción de la imagen aquí

  • Ver el nivel de aislamiento de la base de datos
show variables like 'tx_isolation'; -- MySQL 5.7之前的版本
show variables like 'transaction_isolation'; -- MySQL 5.7之后的版本

Nivel de aislamiento predeterminado de la base de datos MySQL:REPEATABLE-READ

Datos de simulación

-- 创建表
CREATE TABLE test_innodb_lock (a INT(11),b VARCHAR(16))ENGINE=INNODB;
-- 插入数据
INSERT INTO test_innodb_lock VALUES(1,'b2');
INSERT INTO test_innodb_lock VALUES(3,'3');
INSERT INTO test_innodb_lock VALUES(4, '4000');
INSERT INTO test_innodb_lock VALUES(5,'5000');
INSERT INTO test_innodb_lock VALUES(6, '6000');
INSERT INTO test_innodb_lock VALUES(7,'7000');
INSERT INTO test_innodb_lock VALUES(8, '8000');
INSERT INTO test_innodb_lock VALUES(9,'9000');
INSERT INTO test_innodb_lock VALUES(1,'b1');
-- 创建索引
CREATE INDEX test_innodb_a_ind ON test_innodb_lock(a);
CREATE INDEX test_innodb_lock_b_ind ON test_innodb_lock(b);
-- InnnDB事务自动提交,如果需要演示行锁,需要关闭自动提交
SET autocommit=0;

Demostración básica del bloqueo de filas

Inserte la descripción de la imagen aquí

Conclusión de la demostración de bloqueo de fila

Si dos clientes modifican el mismo registro

  • Después de modificar el cliente A, no se envía (no se confirma). En este momento, se bloqueará la modificación del cliente B
  • Después de que el cliente A sea modificado y enviado, el cliente B lo modificará nuevamente, no será bloqueado
  • Si dos clientes modifican diferentes líneas de registro respectivamente, no serán bloqueados

Fallo de índice

El índice no es válido, el bloqueo de fila se convierte en bloqueo de tabla (use el tipo varchar sin comillas simples para que el índice no sea válido)

Cuando el índice no es válido, incluso si varios clientes no están operando en el mismo registro, si no se envía, otros clientes entrarán en el estado de bloqueo.

Entonces, para evitar fallas en el índice

¿Por qué el índice de bloqueo de fila no válido cambia el bloqueo de tabla?

  • Los bloqueos de nivel de fila de InnoDB se implementan bloqueando los elementos de índice en el índice. Los bloqueos de nivel de fila de InnoDB usan bloqueos de nivel de fila solo cuando los datos se recuperan a través de condiciones de índice.
  • De lo contrario, InnoDB usa bloqueos de tabla cuando consulta sin condiciones de índice (clave principal), InnoDB usa bloqueos de tabla en lugar de bloqueos de fila.

Bloqueo de espacios

¿Qué es un bloqueo de espacio?

Inserte la descripción de la imagen aquí

Demostración de bloqueo de espacios

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Los peligros de los bloqueos de huecos

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Pregunta de la entrevista: cómo bloquear una fila

Inserte la descripción de la imagen aquí

Análisis de bloqueo de filas

InnoDB_row_lock

  • Analice la competencia de bloqueo de filas comprobando la variable de estado InnoDB_row_lock
show STATUS like 'innodb_row_lock%'; -- 查看InnoDB_row_lock状态变量

Inserte la descripción de la imagen aquí

Campo Descripción

Campo Descripción
Innodb_row_lock_current_waits El número de cerraduras en espera actualmente.
Innodb_row_lock_time(importante) ¿Cuánto tiempo ha estado bloqueado el sistema desde el inicio del sistema?
Innodb_row_lock_time_avg(importante) Tiempo medio por cerradura
Innodb_row_lock_time_max El tiempo de bloqueo más largo
Innodb_row_lock_waits(importante) Desde que se inició el sistema, ¿cuántas veces se ha bloqueado?

Sugerencia de optimización

  • Intente completar la recuperación de datos a través de índices, evite que no haya índices y actualice los bloqueos de fila a bloqueos de tabla
  • Diseñe el índice de manera razonable y reduzca el alcance del candado
  • Reduzca las condiciones de recuperación tanto como sea posible para evitar bloqueos de espacios
  • Controle el tamaño de la transacción tanto como sea posible, reduzca la cantidad de recursos bloqueados y el tiempo
  • Utilice un nivel de aislamiento de transacciones de bajo nivel tanto como sea posible

para resumir

Inserte la descripción de la imagen aquí

Bloqueo de página (suplemento):

  • El tiempo de sobrecarga y bloqueo se produce entre los bloqueos de la mesa y los bloqueos de las filas, y se producirán interbloqueos
  • La granularidad de bloqueo es entre bloqueos de tabla y bloqueos de fila, con simultaneidad general

Supongo que te gusta

Origin blog.csdn.net/single_0910/article/details/113892413
Recomendado
Clasificación