Når du udfører DML
operationer, InnoDB
låser alle scannede rækker, ikke matchede.
Overvej dette tabellayout:
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;
I dette tilfælde MySQL
vælger RANGE
adgangssti på id
, som den anser for at være billigere end REF
på data
.
I en samtidig transaktion vil du være i stand til at slette eller opdatere rækker 6
, 7
, 8
men ikke rækker 1
til 5
da de er låst (på trods af at kun række 2
blev påvirket).
Hvis du fjerner id <= 5
fra betingelsen ovenfor, vil du være i stand til at slette enhver række undtagen række 3
.
Desværre kan du ikke kontrollere MySQL
adgangsstier i DML
operationer.
Det bedste du kan gøre er at indeksere dine forhold korrekt og håbe på, at MySQL
vil vælge disse indekser.