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

INSERTAR... SELECCIONAR, InnoDB y bloqueo

Eso es correcto. Las filas de la tabla que se lee están bloqueadas con un bloqueo compartido (el SELECT es implícitamente LOCK IN SHARE MODE ). No hay manera de evitar esto. Es más o menos lo que le está pidiendo al sistema:copie todas las filas que coincidan con una condición. La única forma de garantizar que todas las filas coincidan con la condición y que esa lista no cambie durante o inmediatamente después de la ejecución de esa instrucción es bloquear las filas.

Como aclaración sobre por qué no puede INSERT con group_id = 2 :

Esto tiene que ver con que su consulta sea específicamente WHERE group_id = 3 AND created < '2014-01-04' en KEY group_id_created (group_id, created) . Para buscar todas las filas que coincidan con group_id = 3 AND created < '2014-01-04' el índice se recorrerá hacia atrás comenzando con la primera fila que exceda esa condición el límite superior, que es (3, '2014-01-14') y continuando hasta encontrar una fila que no coincida con la condición, que desde created no tiene límite inferior será la primera fila donde group_id < 3 que por supuesto es group_id = 2 .

Eso significa que la primera fila encontrada con group_id = 2 es también bloqueado, que será la fila con el máximo created valor. Esto hará que sea imposible INSERT en la "brecha" entre (2, MAX(created)) y (3, MIN(created)) (No SQL propiamente dicho, por supuesto, solo pseudo-SQL), aunque esto no es un "bloqueo de brecha" específicamente.