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

Interbloqueos en MySQL eliminando filas

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.