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.