sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué un bloqueo IX es compatible con otro bloqueo IX en InnoDB?

https://dev.mysql.com/doc /refman/5.6/en/innodb-lock-modes.html dice:

Esto significa que varios subprocesos pueden adquirir bloqueos IX. Estos bloqueos están a nivel de tabla, no a nivel de fila. Un bloqueo IX significa que el subproceso que lo contiene tiene la intención de actualizar algunas filas en algún lugar en la mesa. Los bloqueos IX solo están destinados a bloquear operaciones de tabla completa.

Puede arrojar algo de luz si considera que funciona en ambos sentidos:si una operación de tabla completa está en curso, entonces ese subproceso tiene un bloqueo a nivel de tabla que bloquea un bloqueo IX.

Las operaciones DML primero deben adquirir un bloqueo IX antes de que puedan intentar bloqueos de nivel de fila. La razón es que no desea que se permita DML mientras un ALTER TABLE está en progreso, o mientras algún otro hilo ha hecho LOCK TABLES...WRITE .

Cambios a nivel de fila como UPDATE , DELETE , SELECT..FOR UPDATE no están bloqueados por un bloqueo IX. Están bloqueados por otros cambios a nivel de fila, o por un bloqueo de tabla completo real (LOCK TABLES , o ciertas sentencias DDL). Pero aparte de esas operaciones de tabla, varios subprocesos que ejecutan DML probablemente puedan funcionar al mismo tiempo, siempre que cada uno trabaje en un conjunto de filas que no se superponen.

Re tu comentario:

El segundo SELECT...FOR UPDATE no está bloqueado esperando en el bloqueo IX, está bloqueado esperando en los bloqueos X (nivel de fila) en filas que ya están bloqueadas por bloqueos X en otro subproceso.

Intenté esto y luego ejecuté SHOW ENGINE INNODB STATUS para poder ver la transacción bloqueada:

---TRANSACTION 71568, ACTIVE 12 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics
select * from test where id=1 for update
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test` 
trx id 71568 lock_mode X locks rec but not gap waiting

¿Ver? Dice que está esperando que se le otorgue el bloqueo con lock_mode X en el índice de clave principal de la tabla test . Eso es un bloqueo de nivel de fila.

Re su confusión sobre LOCK IN SHARE MODE :

Estás hablando de tres niveles de SELECT .

  • SELECT no solicita bloqueos. Ningún candado lo bloquea y no bloquea ningún otro candado.
  • SELECT ... LOCK IN SHARE MODE solicita un bloqueo IS en la tabla y luego S bloquea las filas que coinciden con la exploración del índice. Múltiples subprocesos pueden contener bloqueos IS o bloqueos IX en una tabla. Múltiples subprocesos pueden contener bloqueos S al mismo tiempo.
  • SELECT ... FOR UPDATE solicita un bloqueo IX en la tabla y luego bloqueos X en las filas que coinciden con el escaneo del índice. Los bloqueos X son exclusivos lo que significa que no pueden tener ningún otro subproceso para tener un bloqueo X o un candado S en la misma fila.

Pero ni los bloqueos X ni S se preocupan por los bloqueos IX o IS.

Piense en esta analogía:imagine un museo.

Muchas personas, tanto visitantes como curadores, ingresan al museo. Los visitantes quieren ver pinturas, por lo que usan una placa con la etiqueta "IS". Los curadores pueden reemplazar pinturas, por lo que usan una insignia con la etiqueta "IX". Puede haber muchas personas en el museo al mismo tiempo, con ambos tipos de distintivos. No se bloquean entre sí.

Durante su visita, los aficionados serios al arte se acercarán lo más posible a la pintura y la estudiarán durante largos períodos. Están felices de dejar que otros fanáticos del arte se paren junto a ellos frente a la misma pintura. Por lo tanto, están haciendo SELECT ... LOCK IN SHARE MODE y tienen candados en forma de "S" porque al menos no quieren que se reemplace la pintura mientras la estudian.

Los curadores pueden reemplazar una pintura, pero son corteses con los fanáticos serios del arte y esperarán hasta que estos espectadores terminen y sigan adelante. Así que están tratando de hacer SELECT ... FOR UPDATE (o simplemente UPDATE o DELETE ). Adquirirá candados "X" en este momento, colgando un pequeño cartel que diga "exhibición en proceso de rediseño". Los fanáticos serios del arte quieren ver el arte presentado de manera adecuada, con buena iluminación y alguna placa descriptiva. Esperarán a que se realice el rediseño antes de acercarse (obtendrán un bloqueo de espera si lo intentan).

Además, probablemente haya estado en un museo donde los visitantes más ocasionales deambulan, tratando de mantenerse fuera del camino de otras personas. Miran las pinturas desde el centro de la habitación, sin acercarse demasiado. Pueden mirar las mismas pinturas que otros espectadores están mirando, y pueden mirar por encima de los hombros de los fanáticos del arte serios, para ver las pinturas que también están viendo. Incluso pueden mirar boquiabiertos a los curadores mientras reemplazan las pinturas (no les importa si vislumbran una pintura que aún no ha sido montada e iluminada correctamente). Por lo tanto, estos visitantes ocasionales no bloquean a nadie y nadie bloquea su visualización. Solo están haciendo SELECT y no solicitan ningún bloqueo.

Pero también hay trabajadores de la construcción que se supone que deben derribar paredes y esas cosas, pero no trabajarán mientras haya alguien en el edificio. Esperarán a que todos se vayan y, una vez que comiencen su trabajo, no dejarán entrar a nadie. Así es como la presencia de las insignias IS y IX bloquea el DDL (el trabajo de construcción) y viceversa.