Quando si esegue DML operazioni, InnoDB blocca tutte le righe scansionate, non abbinate.
Considera questo layout della tabella:
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;
In questo caso, MySQL seleziona RANGE percorso di accesso su id , che considera più economico di REF su data .
In una transazione simultanea, potrai eliminare o aggiornare le righe 6 , 7 , 8 ma non le righe 1 a 5 poiché sono bloccati (nonostante il fatto che solo la riga 2 è stato colpito).
Se rimuovi id <= 5 dalla condizione sopra, sarai in grado di eliminare qualsiasi riga tranne la riga 3 .
Sfortunatamente, non puoi controllare MySQL percorsi di accesso in DML operazioni.
La cosa migliore che puoi fare è indicizzare correttamente le tue condizioni e sperare che MySQL sceglierà questi indici.