MySQL Advanced Road (14) - ¿Qué es el bloqueo en InnoDB? ¡Uno para entenderlo!

MySQL Advanced Road (14) - ¿Qué es el bloqueo en InnoDB? ¡Uno para entenderlo!

I. Resumen

​ En el artículo anterior, se presentó en detalle el mecanismo MVCC, que resuelve el problema de cómo leer cuando se actualizan otras transacciones, y lo que presentaremos hoy es resolver el problema de cómo se actualizan otras cosas cuando se actualizan. De hecho, el mecanismo de bloqueo no solo está en MySQL, puede verlo en muchos lenguajes informáticos, como Java, y el middleware, como Redis, también tiene un mecanismo de bloqueo. En general, sin bloqueo, nuestro mundo informático sería caótico, los programas no cooperarían y el código sería extremadamente complejo.

2. Cómo funcionan los bloqueos en MySQL

En MySQL, los bloqueos controlan el acceso a los recursos (como tablas, filas o estructuras de datos internas). Por ejemplo, no puede haber más de una transacción para actualizar la misma fila de datos o la misma tabla al mismo tiempo, o una No se permite la transacción para actualizar la tabla Cuando otra cosa va a insertar o eliminar algunos datos en la tabla.

Los bloqueos en InnoDB usan una estructura liviana y las transacciones generalmente se retienen por un corto período de tiempo (medido en milisegundos o microsegundos). Esto también debe entenderse bien. Dos personas y cosas, A y B, actualizan la misma fila de datos al mismo tiempo. A primero agrega un candado y luego comienza a actualizar los datos. En este momento, B también quiere actualizar los datos, luego verá si el bloqueo está retenido. Sí, si lo hay, espere a ver si alguien lo retiene más tarde. En el proceso anterior, cada cosa generará una interfaz de datos de bloqueo, que registra el trx_id y el estado de espera. Cuando las cosas actualicen una fila de datos, el bloqueo se agregará a esa fila de datos. Si se encuentra que otras cosas han sido reemplazadas Simplemente configure el estado de espera hasta que su bloqueo sea verdadero, espere primero e intente nuevamente más tarde. como abajo

Por favor agregue la descripción de la imagen

El bloqueo del ejemplo anterior es un bloqueo de exclusión mutua, es decir, solo una persona puede bloquear los datos como máximo. Un bloqueo exclusivo en la base de datos .

3. ¿Qué bloqueos hay en MySQL?

Existen los siguientes tipos de bloqueos en InnoDB:

  • bloqueo compartido/bloqueo exclusivo
  • bloqueo de intención
  • bloqueo de registro
  • bloqueo de espacio
  • Tecla siguiente锁
  • Bloqueo de inserción de intención
  • Bloqueo AUTO-INC
  • bloqueo de predicado

Echemos un vistazo a cuáles son. Aquí solo presentamos los que están más estrechamente relacionados con nosotros. Para algunos raros, puede verificar la información relevante usted mismo.

bloqueo compartido/bloqueo exclusivo

​ El nombre en inglés es Shared and Exclusive Locks, por lo que también se conoce como bloqueo S y bloqueo X. La función de este bloqueo es tal como sugiere el nombre. El siguiente es un ejemplo: después de que el subproceso A bloquea los datos con el bloqueo S, el subproceso B también puede agregar el bloqueo S a estos datos, pero no puede agregar el bloqueo X a estos datos, porque el bloqueo X se excluye mutuamente y solo se permite una cosa. para ser agregado al mismo tiempo. Creo que esto no es difícil de entender, entonces, ¿qué pasa con el escenario de la aplicación? No debería ser difícil saber que el bloqueo S permite que varias transacciones compartan una fila de datos. Debe ser cuando todas las transacciones con el bloqueo S están leyendo , para que no se produzcan confusiones, entonces, ¿qué pasa con el bloqueo X? De hecho, es muy simple y definitivamente cuando se actualiza o elimina , ¡porque este tipo de operación no permite realizar múltiples transacciones en los mismos datos al mismo tiempo!

Por lo tanto, no nos resulta difícil conocer las funciones de S lock y X lock:

Bloqueo S

Bloqueo X

​Nota : tanto los bloqueos S como los bloqueos X se cargan en la fila, por lo que también se denominan bloqueos de fila.

bloqueo de intención

Este bloqueo solo comprende el significado de "intención" después de comprender su significado. El bloqueo en InnoDB admite granularidad múltiple. El bloqueo de fila se mencionó anteriormente . Este bloqueo de intención es en realidad un bloqueo de tabla , que se divide en bloqueo compartido de intención (bloqueo IS ) y bloqueo exclusivo de intención (bloqueo IX ), que están bloqueados en el mesa. ¿Cómo se usa este bloqueo de intención? Recuerde cómo encontramos un dato, primero encontramos la tabla correspondiente y luego encontramos la fila correspondiente, ¿verdad? Este proceso de bloqueo es en realidad el mismo. Antes de obtener el bloqueo en la fila, debe obtener el bloqueo en la mesa. Al agregar el bloqueo S a la siguiente fila, primero debe obtener el bloqueo IS en la mesa. De manera similar, al agregar un bloqueo X a una fila Cuando primero necesita obtener el bloqueo IX en la tabla. (Nota: a diferencia de los bloqueos S/X, se permiten múltiples transacciones para agregar bloqueos IS y bloqueos IX a la tabla, pero solo una transacción puede adquirir el bloqueo IX en la mesa a la vez ).

Las siguientes son las instrucciones SQL para bloquear y adquirir bloqueos:

# 可以通过下面的语句来获取指定表的意向排它锁(获取表的IX锁,只能有一个事物获取到)
LOCK TABLES ... WRITE

# 加上意向共享锁(加IS锁,同一个表可以加多个)
SELECT ... LOCK IN SHARE MODE

# 加上意向排他锁
SELECT ... FOR UPDATE(加IX锁,同一个表可以加多个)

# 查看事物的加锁状态(在Status列中的TRANSACTIONS部分可以查看)
SHOW ENGINE INNODB STATUS

La siguiente es la relación de compatibilidad entre estos bloqueos:

X IX S ES
X conflicto conflicto conflicto conflicto
IX conflicto Compatible conflicto Compatible
S conflicto conflicto Compatible Compatible
ES conflicto Compatible Compatible Compatible

En este punto, no es difícil para nosotros descifrar el papel de los bloqueos intencionales:

​Además de esta operación completa, el bloqueo de intención no evitará nada. Es solo la intención del nombre de la tabla, que indica que algo está o puede operar en una fila de datos más adelante, que también es el origen del nombre "intento".LOCK TABLES ... WRITE

bloqueo de registro

Los bloqueos de registro, como sugiere su nombre, se utilizan en registros indexados. Cuando un registro de un índice está bloqueado, puede evitar que otras cosas inserten, actualicen o eliminen este registro. El bloqueo de nivel de fila mencionado anteriormente es esencialmente un bloqueo de registro

Si no crea un índice, InnoDB creará un índice agrupado local oculto

bloqueo de espacio

Gap lock, como su nombre lo indica, se usa para cerrar la brecha, ¿qué tipo de brecha es esa? De hecho, es la brecha del índice. Es posible que tenga preguntas, ¿bajo qué circunstancias necesita bloquear la brecha del índice? Permítanme dar un ejemplo: ahora la transacción A está ejecutando una declaración SQL de este tipo: SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20después de que la transacción A termina de ejecutar este SQL, una transacción B inserta datos c1 = 11, y luego la transacción A ejecuta esta declaración nuevamente antes de confirmar. En este momento, la transacción ¿A encuentra que los datos obtenidos del mismo rango dos veces antes y después son realmente diferentes? Esta situación es lo que decía en el artículo anterior 幻读, ¡como una alucinación!

Para esta condición WHERE con una condición de rango, para evitar lecturas fantasma, necesitamos agregar un bloqueo de espacio al espacio dentro de este rango. El SQL se escribe así: SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE, después de hacerlo, evitará que otras cosas sucedan a 10 La operación de insertar datos en el rango de 15

Un espacio puede abarcar valores de índice únicos o múltiples, e incluso puede estar vacío. Una declaración que usa un índice único para buscar filas únicas no requiere bloqueos de espacios.

SELECT * FROM child WHERE id = 100;

Si idla columna no está indexada o tiene un índice no único, la declaración bloquea el espacio anterior.

Vale la pena señalar que para la misma brecha, se pueden permitir transacciones múltiples para agregarle bloqueos de brecha.

Después de comprender el contenido anterior, no es difícil para nosotros descubrir el papel del bloqueo de espacio:

Un bloqueo de espacio Los bloqueos de brecha pueden coexistir. Un bloqueo de espacio tomado por una transacción no evita que otra transacción tome un bloqueo de espacio en el mismo espacio. No hay diferencia entre un bloqueo de espacio compartido y un bloqueo de espacio exclusivo. No entran en conflicto entre sí y realizan la misma función.

Tecla siguiente锁

Por el nombre, realmente no es fácil de entender. Permítanme hablar primero sobre cómo se ve este bloqueo. El llamado bloqueo Next-Key es en realidad una combinación de bloqueo de espacio + bloqueo de registro . Su función es evitar que ocurran lectura fantasma. Hablando de bloqueos de brecha, solo puede garantizar que la cantidad de datos en las dos consultas de rango antes y después de una cosa sea la misma, pero no puede evitar que los datos se modifiquen. Por lo tanto, el bloqueo de brecha solo puede causar que no -Lecturas repetibles Para evitar que esto suceda, y observe el bloqueo de registro para usarlo en conjunto.

InnoDB, el valor predeterminado es el nivel de aislamiento de LECTURA REPETIBLE. Al buscar o escanear el índice, agregará bloqueos de brecha y bloqueos de registro a las brechas y registros encontrados, es decir, bloqueos de tecla siguiente, uno tras otro, lo que puede evitar que otros Las cosas insertan nuevos registros al frente. Este puede ser el origen del nombre del bloqueo Next-Key, ya que su comportamiento de bloqueo, uno tras otro

En resumen, se puede ver el papel de los bloqueos Next-Key:

​InnoDB utiliza bloqueos de tecla siguiente en el nivel de LECTURA REPETIBLE para evitar que se produzcan lecturas fantasma

otras cerraduras

Para los bloqueos de inserción intencional , los bloqueos AUTO-INC y los bloqueos de predicado , este artículo no los explicará porque son relativamente sesgados. Si está interesado, puede verificar la información relevante usted mismo. Después de comprender los bloqueos explicados anteriormente, creo que los bloqueos restantes ciertamente no son difíciles de entender.

4. Resumen

​ Hoy presenté los bloqueos en InnoDB, así como los tipos comunes. Su granularidad y función son diferentes, y nacen para resolver diferentes problemas. Por lo tanto, ¡es muy importante entender para qué problemas se utilizan!

​ Lo anterior es todo el contenido de este artículo. Si hay algún problema, indíquelo y avancemos juntos.

Supongo que te gusta

Origin blog.csdn.net/weixin_44829930/article/details/120851278
Recomendado
Clasificación