¿Se bloqueará la inserción en MySQL?
Análisis de la situación de bloqueo y las causas del interbloqueo
Para facilitar la reproducción de todos, la estructura completa de la tabla y los datos son los siguientes:
CREAR TABLA `t3` (
p>
`c1` int(11) NOT NULL AUTO_INCREMENT,
`c2` int(11) DEFAULT NULL,
CLAVE PRIMARIA ( `c1`),
p>
CLAVE ÚNICA `c2` (`c2`)
) MOTOR=InnoDB
insertar en valores t3( 1,1),(15,15),( 20,20);
En el momento en que la sesión1 ejecuta el compromiso, veremos que una de las sesiones2 y 3 informa un punto muerto. Este interbloqueo se genera así:
1. Cuando la sesión1 ejecuta la eliminación, el bloqueo X se agregará al registro c2 = 15 del índice único c2 (es decir, lo que se observa dentro de MySQL: bloqueo X pero no). gap);
2.? Cuando la sesión2 y la sesión3 ejecutan la inserción, debido a un conflicto único en la detección de restricción única, se agregará S Next-Key Lock, es decir, el intervalo (1,15] se agregará El bloqueo incluye espacios y está bloqueado por el Bloqueo X de seesion1 y entra en espera
3 Después de ejecutar la confirmación, la sesión1 liberará el Bloqueo X, y tanto la sesión2 como la sesión3 obtendrán el S Next. -Bloqueo de teclas;
4.?session2 y session3 continúan realizando operaciones de inserción. En este momento, aparece INSERT INTENTION LOCK (insertar bloqueo de intención), y debido a que el bloqueo de intención de inserción será bloqueado por el bloqueo de espacio. , la sesión2 y la sesión3 se esperan entre sí, lo que provoca un punto muerto.
El registro de punto muerto es el siguiente:
Haga clic para ingresar la descripción de la imagen
INSERTAR INTENCIÓN. LOCK
En el cuarto punto del análisis de interbloqueo anterior, si no se analiza el bloqueo de intención de inserción, también provocará un interbloqueo, porque la inserción eventualmente agregará X Lock al registro, y la sesión2 y la sesión3 todavía se bloquearán entre sí y se esperarán unos a otros.
Pero insertar el bloqueo de intención es objetivo. Existe, podemos encontrarlo en el manual oficial y no se puede ignorar: antes de insertar la fila, un tipo. Se establece un bloqueo de espacio llamado bloqueo de espacio de intención de inserción. Este bloqueo señala la intención de insertar de tal manera que varias transacciones que se insertan en el mismo espacio de índice no necesitan esperarse entre sí si no se insertan en la misma posición dentro del espacio. .
El bloqueo de intención de inserción es en realidad un bloqueo de espacio especial, pero no bloquea otros bloqueos. Supongamos que hay registros de índice con valores 4 y 7. Las dos transacciones que intentan insertar valores. 5 y 6 usan el bloqueo de intención de inserción para bloquear el espacio, es decir, agregue un bloqueo de espacio en (4, 7) antes de adquirir el bloqueo exclusivo en la fila insertada, pero las dos transacciones no entrarán en conflicto con las esperas de la otra.
Al insertar un registro, comprobará si hay un objeto de bloqueo en el siguiente registro en la posición de inserción actual. Si hay un objeto de bloqueo en el siguiente registro, es necesario determinar si está bloqueado. El objeto ha bloqueado el espacio. Si el espacio está bloqueado, el bloqueo de intención de inserción entra en conflicto con él y entra en estado de espera (los bloqueos de intención de inserción no son mutuamente excluyentes). Para resumir las propiedades de este bloqueo:
1. No bloqueará ningún otro bloqueo
2.
En el proceso de aprendizaje de MySQL, generalmente solo se puede observar cuando está bloqueado, por eso a menudo se ignora...
GAP LOCK
En este ejemplo, otro punto importante es el bloqueo de espacios. Por lo general, cuando hablamos de bloqueo de espacios, solo pensamos en el nivel de aislamiento de LECTURA REPETIBLE y su uso para resolver lecturas fantasma. Pero, de hecho, en el nivel de aislamiento LECTURA COMPROMETIDA, también existirá un bloqueo de brecha, que solo ocurre cuando la verificación de restricción única detecta un conflicto único, y se agregará S Next-key Lock, es decir, la brecha entre el registro y el registro anterior. Se añade el hueco para disfrutar del candado.
Se puede verificar a través del siguiente ejemplo:
Haga clic para ingresar la descripción de la imagen.
Aquí la sesión 1 encontró el único conflicto al insertar datos, aunque fue un error. se informó, era correcto (15, 20] El bloqueo S Next-Key agregado no se liberará inmediatamente, por lo que la sesión2 está bloqueada. Otra situación es el ejemplo al principio de este artículo. Cuando la inserción de la sesión2 encuentra el único conflicto pero es bloqueado por X Lock, no se informará ningún error de inmediato "Clave duplicada", pero aún tendrá que esperar para obtener S Next-Key Lock
Hay una pregunta que ha sido confusa durante mucho tiempo: Es cierto que el único conflicto que ocurre requiere agregar S Next-Key Lock, pero ¿qué significa bloquear? O es una verificación de restricción única implementada a través de S Next-Key Lock, pero esto significa que el bloqueo se liberará inmediatamente cuando. la inserción no encuentra un conflicto único, lo que no cumple con el principio de bloqueo de dos etapas. Discutamos juntos para obtener una buena explicación.
Si está en REPEATABLE-READ, excepto por la restricción única. En el conflicto mencionado anteriormente, la existencia de bloqueo de espacio es la siguiente:
Índice ordinario (bloqueo S/X (índice no único), todos tienen atributos de espacio, que bloquearán los registros y los cerrados a la izquierda y a la derecha). -abrir rango desde el registro anterior al siguiente registro. Por ejemplo, si hay un registro y elimina 6, se bloqueará [4, 8) Todo el intervalo.
Con respecto al bloqueo de espacios, creo que los DBA tienen el mismo estado de ánimo, por lo que mis sugerencias son:
1. En la mayoría de los escenarios comerciales, se puede usar MySQL. Configure el sector de aislamiento en LEER-. COMPROMETIDO;
2. Cuando sea conveniente para la empresa controlar los valores de campo únicos, intente reducir la cantidad de índices únicos en la tabla.
Matriz de conflictos de bloqueo
El GAP LOCK que mencionamos anteriormente es en realidad una propiedad del bloqueo. Además, sabemos que los modos de bloqueo regulares de InnoDB son: S y X, es decir, candado compartido y candado exclusivo. El modo de bloqueo y los atributos de bloqueo se pueden combinar a voluntad. La matriz de conflicto después de la combinación es la siguiente, lo cual es muy útil para analizar el punto muerto:
Haga clic para ingresar la descripción de la imagen
.