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.