El uso de bloqueos en MySQL (bloqueos globales, a nivel de tabla, a nivel de fila)

        Un bloqueo es un mecanismo por el cual una computadora coordina el acceso simultáneo a un recurso por parte de múltiples procesos o subprocesos. En una base de datos, además de la competencia tradicional por los recursos informáticos (CPU, RAM, E/S), los datos también son un recurso compartido por muchos usuarios. Cómo garantizar la coherencia y la validez del acceso simultáneo a los datos es un problema que todas las bases de datos deben resolver, y los conflictos de bloqueo también son un factor importante que afecta el rendimiento del acceso simultáneo a las bases de datos. Desde esta perspectiva, los bloqueos son particularmente importantes y más complejos para las bases de datos.

        Los bloqueos en MySQL se dividen en las siguientes tres categorías según la granularidad de los bloqueos: 

  • Bloqueo global : bloquea todas las tablas de la base de datos.
  • Bloqueo a nivel de tabla : cada operación bloquea toda la tabla.
  • Bloqueo a nivel de fila : cada operación bloquea los datos de fila correspondientes.

A continuación, introduciremos estos tres aspectos a su vez:

bloqueo global

        El bloqueo global es para bloquear toda la instancia de la base de datos. Después del bloqueo, toda la instancia está en un estado de solo lectura. Las declaraciones de escritura DML posteriores, las declaraciones DDL y las declaraciones de compromiso de transacciones que se hayan actualizado se bloquearán.

        Su escenario de uso típico es hacer una copia de seguridad lógica de toda la base de datos y bloquear todas las tablas para obtener una vista coherente y garantizar la integridad de los datos. A continuación, veamos el uso específico:

①Agregar un bloqueo global

flush tables with read lock ;

②Copia de seguridad de datos

mysqldump -uroot –p1234 itcast > itcast.sql
-- 其中itcast是要备份的数据库的名称,itcast.sql是备份后的存储路径文件名
-- 注意,此命令不是mysql的命令,不能在mysql中执行,需要在windows或linux命令行中执行

Liberar el candado

unlock tables ;

        Agregar un bloqueo global a la base de datos es una operación relativamente pesada y existen los siguientes problemas:

  • Si se realiza una copia de seguridad en la biblioteca principal, no se pueden realizar actualizaciones durante el período de copia de seguridad y, básicamente, la empresa debe cerrarse.
  • Si se realiza una copia de seguridad en la biblioteca esclava, la biblioteca esclava no puede ejecutar el registro binario (binlog) sincronizado desde la biblioteca maestra durante el período de copia de seguridad, lo que provocará un retraso maestro-esclavo.

Nota: En el motor InnoDB, podemos agregar el parámetro --single-transaction parámetro durante la copia de seguridad para completar la copia de seguridad de datos coherente sin bloqueo: mysqldump --single-transaction -uroot –p123456 itcast > itcast.sql

bloqueo de mesa

        Los bloqueos a nivel de tabla bloquean toda la tabla para cada operación. La granularidad de bloqueo es grande, la probabilidad de conflictos de bloqueo es la más alta y la concurrencia es la más baja. Aplicado en motores de almacenamiento como MyISAM, InnoDB y BDB.

Los bloqueos de nivel de tabla se dividen principalmente en las siguientes tres categorías:

  • bloqueo de mesa
  • Bloqueo de metadatos (bloqueo de metadatos, MDL)
  • bloqueo de intención 

① bloqueo de reloj

        Para los bloqueos de tabla, hay dos tipos: bloqueo de lectura compartido de tabla (bloqueo de lectura) , bloqueo de escritura exclusivo de tabla (bloqueo de escritura) 

        Si se agrega un bloqueo de lectura compartido, este cliente y otros clientes solo pueden leer y no pueden escribir; si se agrega un bloqueo de escritura exclusivo, este cliente puede leer y escribir, mientras que otros clientes no pueden leer ni escribir. 

-- 加锁
lock tables 表名... read/write。
-- 释放锁
unlock tables / 客户端断开连接 。

② Bloqueo de metadatos (MDL)

El proceso de bloqueo de MDL es controlado automáticamente por el sistema y no necesita ser utilizado explícitamente, se agregará automáticamente         al acceder a una tabla . La función principal del bloqueo MDL es mantener la coherencia de los datos de los metadatos de la tabla. Cuando hay transacciones activas en la tabla, los metadatos no se pueden escribir. Para evitar conflictos entre DML (adición, eliminación, modificación y consulta) y DDL (estructura de la tabla de operaciones), asegúrese de leer y escribir correctamente.

        Los metadatos aquí pueden entenderse simplemente como la estructura de tabla de una tabla . Es decir, cuando una determinada tabla involucra transacciones no comprometidas, la estructura de la tabla de esta tabla no se puede modificar.

Los bloqueos de metadatos se pueden dividir en las siguientes dos categorías:

  • Bloqueo de lectura compartido de MDL : al agregar, eliminar, modificar y consultar una tabla, el bloqueo compartido de MDL se agrega automáticamente
  • Bloqueo de escritura exclusivo de MDL : cuando se cambia la estructura de la tabla, el bloqueo exclusivo de MDL se agrega automáticamente

-- 查看元数据锁的加锁情况
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

③ Bloqueo de intención 

        Para evitar conflictos entre los bloqueos de fila y los bloqueos de tabla agregados durante la ejecución de DML, los bloqueos de intención se introducen en InnoDB, de modo que los bloqueos de tabla no necesitan verificar si cada fila de datos tiene bloqueos de fila y usar bloqueos de intención para reducir las verificaciones de bloqueo de tabla. . Es decir: al realizar operaciones DML, se agregarán bloqueos de fila a las filas involucradas y también se agregarán bloqueos de intención a la tabla. Y otros clientes, al agregar un bloqueo de tabla a esta tabla, determinarán si el bloqueo de tabla se puede agregar con éxito de acuerdo con el bloqueo de intención agregado a la tabla, en lugar de juzgar la situación de bloqueo de fila fila por fila.

Los bloqueos de intención se pueden dividir en dos categorías:

  • Intención de bloqueo compartido (IS) : agregado por la instrucción select... lock in share mode. Compatible con bloqueo compartido de bloqueo de tabla (lectura), mutuamente excluyente con bloqueo exclusivo de bloqueo de tabla (escritura).
  • Bloqueo exclusivo de intención (IX) : agregado por inserción, actualización, eliminación, selección... para actualización. Los bloqueos compartidos (lectura) y los bloqueos exclusivos (escritura) se excluyen mutuamente con los bloqueos de tabla, y los bloqueos de intención no se excluyen mutuamente

Una vez que se confirma la transacción, el bloqueo compartido de intención y el bloqueo exclusivo de intención se liberarán automáticamente. 

-- 查看意向锁及行锁的加锁情况
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

bloqueo de nivel de fila

        Bloqueo a nivel de fila, cada operación bloquea los datos de fila correspondientes. La granularidad de bloqueo es la más pequeña, la probabilidad de conflictos de bloqueo es la más baja y la simultaneidad 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 fila se implementan bloqueando elementos de índice en el índice, en lugar de bloquear registros. Para bloqueos de nivel de fila, hay tres categorías principales:

  • Bloqueo de fila (Bloqueo de registro) : un bloqueo que bloquea un registro de una sola fila, evitando que otras transacciones actualicen y eliminen esta fila. Es compatible con los niveles de aislamiento RC y RR.
  • Bloqueo de brecha : bloquee la brecha del registro del índice (excluyendo este registro), asegúrese de que la brecha del registro del índice permanezca sin cambios y evite que se inserten otras transacciones en esta brecha, lo que resultará en una lectura fantasma. Ambos son compatibles con el nivel de aislamiento RR.
  • Bloqueo de tecla siguiente : una combinación de bloqueo de fila y bloqueo de espacio, que bloquea los datos al mismo tiempo y bloquea el espacio frente a los datos. Compatible bajo el nivel de aislamiento RR.

① bloqueo de fila

        InnoDB implementa los siguientes dos tipos de bloqueos de fila:

  • Bloqueo compartido (S) : permite que una transacción lea una fila, evitando que otras transacciones obtengan bloqueos exclusivos en el mismo conjunto de datos.
  • Bloqueo exclusivo (X) : permite que las transacciones que adquieren bloqueos exclusivos actualicen los datos, evitando que otras transacciones adquieran bloqueos compartidos y exclusivos en el mismo conjunto de datos. 

De forma predeterminada, InnoDB se ejecuta en el nivel de aislamiento de transacciones de LECTURA REPETIBLE e InnoDB utiliza bloqueos de tecla siguiente para búsquedas y escaneos de índice para evitar lecturas fantasma.

  • Al buscar en un índice único , al realizar una coincidencia equivalente en registros existentes, se optimizará automáticamente a un bloqueo de fila .
  • El bloqueo de fila de InnoDB es un bloqueo para el índice. Si no recupera datos a través de la condición de índice, InnoDB bloqueará todos los registros en la tabla y luego se actualizará a un bloqueo de tabla.

② Bloqueo de espacios / Bloqueo de teclas Pro

        De forma predeterminada, InnoDB se ejecuta en el nivel de aislamiento de transacciones de LECTURA REPETIBLE e InnoDB utiliza bloqueos de tecla siguiente para búsquedas y escaneos de índice para evitar lecturas fantasma.

  • La consulta equivalente en el índice (único índice) se optimiza como un bloqueo de brecha cuando se bloquea un registro que no existe.
  • En la consulta equivalente sobre el índice (índice ordinario), cuando el último valor no cumple con los requisitos de la consulta cuando se desplaza hacia la derecha, el bloqueo de tecla siguiente degenera en un bloqueo de intervalo (es decir, el valor actual y el intervalo detrás de él). están bloqueados).
  • La consulta de rango sobre el índice (índice único) accederá al primer valor que no cumpla la condición (es decir, bloquear el rango). 
Aviso:
        El único propósito de un bloqueo de brecha es evitar que otras transacciones se inserten en la brecha. Los bloqueos de brecha pueden coexistir, y un bloqueo de brecha tomado por una transacción no impide que otra transacción tome un bloqueo de brecha en la misma brecha.

Supongo que te gusta

Origin blog.csdn.net/weixin_52850476/article/details/124767175
Recomendado
Clasificación