Al realizar DML operaciones, InnoDB bloquea todas las filas escaneadas, no coincidentes.
Considere este diseño de mesa:
DROP TABLE t_tran;
CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;
DROP TABLE t_tran;
CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;
INSERT
INTO t_tran
VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8);
START TRANSACTION;
DELETE
FROM t_tran
WHERE data = 2
AND id <= 5;
En este caso, MySQL selecciona RANGE ruta de acceso en id , que considera más barato que REF en data .
En una transacción concurrente, podrá eliminar o actualizar filas 6 , 7 , 8 pero no las filas 1 a 5 ya que están bloqueados (a pesar de que solo la fila 2 fue afectado).
Si elimina id <= 5 de la condición anterior, podrá eliminar cualquier fila menos la fila 3 .
Desafortunadamente, no puedes controlar MySQL rutas de acceso en DML operaciones.
Lo mejor que puede hacer es indexar sus condiciones correctamente y esperar que MySQL elegirá estos índices.