[Serie MySQL] - Mecanismo de bloqueo MYSQL

[Serie MySQL] - Mecanismo de bloqueo MYSQL


En pocas palabras, el mecanismo de bloqueo de la base de datos es una regla diseñada por la base de datos para garantizar la coherencia de los datos y ordenar varios recursos compartidos cuando se accede a ellos al mismo tiempo.

Debido a las características de su propia arquitectura, la base de datos MySQL tiene múltiples motores de almacenamiento de datos, los mecanismos de bloqueo de cada motor de almacenamiento están optimizados y diseñados para los escenarios específicos que enfrentan, por lo que los mecanismos de bloqueo de cada motor de almacenamiento también son bastante diferentes.

1. Bloqueo a nivel de mesa

El bloqueo a nivel de tabla bloquea toda la tabla para cada operación. La granularidad de bloqueo es grande, la probabilidad de conflicto de bloqueo es la más alta y la concurrencia es la más baja. Aplicados en motores de almacenamiento como MyISAM, InnDB y BDB, los bloqueos a nivel de tabla generalmente se dividen en 1) Bloqueos de tabla 2) Bloqueos de metadatos 3) Bloqueos de intención.

Leer bloqueo en la mesa

lock tables 表名.. read; -- 是指可以对多张表加锁

cerradura exclusiva de mesa

lock tables 表名... write; -- 可以对多张表加独占锁

desbloquear bloqueo

unlock tables; -- 释放锁,客户端短裤连接

2. Bloqueos a nivel de fila

El bloqueo a nivel de fila bloquea los datos de la fila correspondiente para cada operación. La granularidad de bloqueo es la más pequeña, la probabilidad de conflictos de bloqueo es la más baja y la concurrencia es la más alta. Aplicado en el motor de almacenamiento InnoDB. Los datos de InnoDB se organizan en función de índices y los bloqueos de filas se implementan bloqueando entradas de índice en el índice, en lugar de bloquear registros.

Para los bloqueos a nivel de fila, se dividen principalmente en las siguientes tres categorías:

  1. Bloqueo de fila (Bloqueo de registro) : bloquea un registro de una sola fila para evitar que otras transacciones actualicen y eliminen la fila. Soportado bajo niveles de aislamiento RC y RR
  2. Bloqueo de espacio : bloquea el espacio del registro de índice (excluido el registro) para garantizar que el espacio del registro de índice permanezca sin cambios y evita que otras transacciones se inserten en este espacio y provoquen lecturas fantasma. Soportado bajo el nivel de aislamiento RR.
  3. Bloqueo de siguiente tecla : una combinación de bloqueo de fila y bloqueo de espacio, que bloquea los datos al mismo tiempo y bloquea el espacio delante de los datos. Soportado bajo el nivel de aislamiento RR.

InnoDB implementa los siguientes dos tipos de bloqueos de fila:

  1. Bloqueo compartido (S): permite que una transacción lea una fila y evita que otras transacciones obtengan un bloqueo exclusivo en el mismo conjunto de datos.
  2. Bloqueo exclusivo (X): permite que la transacción que adquiere el bloqueo exclusivo actualice los datos y evita que otras transacciones adquieran bloqueos compartidos y bloqueos exclusivos en el mismo conjunto de datos.
SQL tipo de bloqueo de fila ilustrar
INSERTAR… cerradura exclusiva Bloquear automáticamente
ACTUALIZAR… cerradura exclusiva Bloquear automáticamente
BORRAR… cerradura exclusiva Bloquear automáticamente
SELECCIONAR… sin ningún candado
SELECCIONAR… BLOQUEAR EN MODO COMPARTIR bloqueo compartido Bloqueo manual
SELECCIONAR…PARA ACTUALIZAR cerradura exclusiva Bloqueo manual
Cerraduras de espacio

El bloqueo de espacios bloquea el espacio en el registro de índice, o el rango antes del primer registro de índice, o el rango después del último registro de índice.

Condiciones para generar bloqueos de brecha (bajo el nivel de aislamiento de transacciones RR);)

1) Utilice el bloqueo de índice ordinario; 2) Utilice un índice único de varias columnas; 3) Utilice un índice único para bloquear registros de varias filas. Para declaraciones que utilizan un índice único para buscar y bloquear una fila de registros. Sólo se generarán bloqueos de registros, no bloqueos de espacios.

Activar la configuración de bloqueo de espacios

Compruebe si el bloqueo de espacios está habilitado

show variables like 'innodb_locks_unsafe_for_binlog';

El valor predeterminado de innodb_locks_unsafe_for_binlog es APAGADO, lo que habilita bloqueos de espacios. Debido a que este parámetro está en modo de solo lectura, si desea deshabilitar el bloqueo de espacios, debe modificar my.cnf y reiniciarlo para que surta efecto.

[mysqld]
innodb_locks_unsafe_for_binlog = 1

en conclusión

  1. Para una declaración de bloqueo que especifica un registro a consultar, si el registro no existe, se generará un bloqueo de registro y un bloqueo de espacio. Si el registro existe, se generará un bloqueo de registro, como por ejemplo: WHERE Id=1 FOR ACTUALIZAR;
  2. Para declaraciones de consulta que buscan un rango determinado, se producirán espacios en blanco, como por ejemplo: DONDE ID ENTRE 5 Y 7 PARA ACTUALIZAR;
  3. En las columnas de índice normales, no importa qué tipo de consulta, simplemente bloquear generará bloqueos de espacio.
Cerraduras de siguiente llave

El bloqueo de clave temporal es una combinación de bloqueo de registro y bloqueo de espacio. Su rango de bloqueo incluye tanto registros de índice como intervalos de índice.

El objetivo principal del bloqueo temporal de teclas también es evitar lecturas fantasma. Si el nivel de aislamiento de la transacción se reduce a RC, el bloqueo de clave temporal también dejará de ser válido.

3. Bloqueo a nivel de página

El bloqueo es el bloqueo en la granularidad de la página. Los recursos de datos bloqueados son más que bloqueos de fila, porque puede haber varios registros de fila en una página. Cuando usamos bloqueos de página, habrá un desperdicio de datos, pero este desperdicio es solo una fila de datos en una página como máximo. El costo del bloqueo de página está entre el bloqueo de tabla y el bloqueo de fila, y se producirá un punto muerto. La granularidad del bloqueo es entre bloqueos de tabla y bloqueos de fila, y la concurrencia es promedio.

4. Bloqueo compartido (bloqueo S)

Bloqueo compartido, también conocido como bloqueo S y bloqueo de lectura. Para cerraduras de fila. Cuando una transacción agrega un bloqueo de lectura a los datos, otras transacciones solo pueden agregar bloqueos de lectura a los datos bloqueados y no pueden agregar bloqueos de escritura (bloqueos exclusivos), por lo que otras transacciones solo pueden leer pero no escribir.

Método de bloqueo:

select * from Table where id=2 lock in share mode;

Método de liberación:

commit 或 rollback;

5. Bloqueo exclusivo (bloqueo X)

X lock, que en inglés es Exclusive Lock, es un candado exclusivo. También se le puede llamar bloqueo de escritura; el bloqueo X es exclusivo. Es decir, un bloqueo de escritura bloqueará otros bloqueos X y S. Cuando una transacción necesita modificar un registro, primero debe obtener el bloqueo X del registro.

Formato de bloqueo de bloqueo X:

select ... for update;

6. Punto muerto

Dado que Mysql tiene muchos tipos, pueden producirse puntos muertos en el desarrollo real.

6.1 Causas del punto muerto

El punto muerto se refiere a un fenómeno en el que dos o más procesos se esperan entre sí debido a la competencia por los recursos durante la ejecución. Sin influencia externa, no podrán continuar. En este momento, el sistema está en un estado de punto muerto o el sistema está en un punto muerto.

La clave del punto muerto es que el orden en el que se bloquean dos (o más) sesiones es inconsistente.

La clave correspondiente para resolver el problema del punto muerto es bloquear diferentes sesiones en orden.

6.2 Cómo evitar un punto muerto
  • Se accede a las tablas y filas en un orden fijo. Por ejemplo, entre dos transacciones que actualizan datos, la transacción A actualiza los datos en el orden 1,2; la transacción B actualiza los datos en el orden: 2,1; esto puede causar un punto muerto.
  • Divida las cosas grandes en cosas pequeñas. Las transacciones grandes son más propensas a estancarse. Si el negocio está en funcionamiento, divida la transacción grande en otras más pequeñas.
  • En la misma transacción, intente bloquear todos los recursos necesarios a la vez para reducir la probabilidad de un punto muerto.
  • Baje el nivel de aislamiento. Si el negocio lo permite, también es una mejor opción reducir el nivel de aislamiento. Por ejemplo, ajustar el nivel de aislamiento de RR a RC puede evitar muchos interbloqueos causados ​​por bloqueos de brecha.
  • Agregue índices razonables a la tabla. Se puede ver que si no se utiliza el índice, se agregará un bloqueo a cada fila de la tabla y la probabilidad de un punto muerto aumentará considerablemente.

7. Resumen

Dado 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 de los bloqueos de tabla, es muy superior a los bloqueos de tabla de MyISAM en términos de capacidades generales de procesamiento concurrente. Cuando la concurrencia del sistema es alta, el rendimiento general de InnoDB tendrá ventajas obvias en comparación con MyISAM.
Sin embargo, los bloqueos de nivel de fila de InnoDB también tienen su lado frágil. Cuando los usamos incorrectamente, el rendimiento general de InnoDB no solo no puede ser mayor que MyISAM, puede que incluso sea peor.

  1. En la medida de lo posible, toda la recuperación de datos se puede completar a través del índice para evitar que los bloqueos de filas sin índice se actualicen a bloqueos de tabla.
  2. Diseñar índices razonablemente para minimizar el alcance de los bloqueos.
  3. Reduzca las condiciones y los rangos del índice tanto como sea posible para evitar bloqueos de brechas
  4. Intente controlar el tamaño de las transacciones y reducir la cantidad y duración de los recursos bloqueados.
  5. Utilice aislamiento de transacciones de bajo nivel siempre que sea posible (necesita el nivel empresarial para cumplir con los requisitos)

Supongo que te gusta

Origin blog.csdn.net/songjianlong/article/details/132962707
Recomendado
Clasificación