¿Por qué la actualización de MySQL InnoDB también establece bloqueo brecha?

Jacky1205:

Por lo que yo sé la cerradura brecha se usa para prevenir las lecturas fantasma, y ​​me encontré con cerradura brecha se establece mediante el bloqueo de lectura en la mayoría de los artículos a través de la búsqueda de Google.

Una cerradura brecha es un bloqueo en un hueco entre los registros de índice, o un bloqueo en la brecha delante de la primera o después del último registro de índice. Por ejemplo, SELECT c1 de T donde C1 entre 10 y 20 FOR UPDATE; impide que otras transacciones desde la inserción de un valor de 15 en t.c1 columna, si hay o no era ya cualquier valor en la columna, debido a que los espacios entre todos los valores existentes en la gama están bloqueados.

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-gap-locks

Creo que esto (conjunto de bloqueo brecha en la lectura de bloqueo) es suficiente. ¿Por qué la actualización , eliminar también sistema de la cerradura brecha.

ACTUALIZACIÓN ... DONDE ... establece un bloqueo exclusivo de próxima clave en cada registro encontrado por la búsqueda. Sin embargo, sólo se requiere un bloqueo de registro de índice para las declaraciones que se cierran filas con un índice único para buscar una fila única.

https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html

Y otra cuestión es lo que pasó, si no existe un índice adecuado donde cerradura brecha se puede conectar? Mueve hacia atrás caída de bloqueo en toda la tabla?

Aquí asumimos que el uso del nivel de aislamiento de las transacciones Lectura repetible.

Bill Karwin:

Depende de las condiciones en su SELECT, UPDATE o DELETE. Establecen bloquear los espacios vacíos para evitar que otras sesiones simultáneas de añadir registros al que se corresponde con las condiciones.

En InnoDB, las declaraciones de bloqueo siempre se bloquean las versiones de filas comprometidas recientes la mayoría. Así que en realidad no obedecen la instantánea REPETIBLE LEER. Ellos actúan más como READ COMMITTED.

Por lo tanto, si usted hace una declaración como esta:

UPDATE FROM MyTable SET ... WHERE created_at > '2020-03-22';

Debe cerrar la brecha que sigue al valor más alto de created_at, lo que evitará que otras sesiones de añadir nuevas filas.

Esto es para simular REPETIBLE LEER, para asegurarse de que si se ejecuta la misma actualización de nuevo, que afectará a las mismas filas, y que no afectará accidentalmente nuevas filas.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=373027&siteId=1
Recomendado
Clasificación