Při provádění DML operace, InnoDB uzamkne všechny naskenované řádky, které se neshodují.
Zvažte toto rozložení tabulky:
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;
V tomto případě MySQL vybere RANGE přístupová cesta na id , které považuje za levnější než REF na data .
V souběžné transakci budete moci smazat nebo aktualizovat řádky 6 , 7 , 8 ale ne řádky 1 až 5 protože jsou uzamčeny (navzdory skutečnosti, že pouze řádek 2 byl ovlivněn).
Pokud odeberete id <= 5 z výše uvedené podmínky budete moci smazat libovolný řádek kromě řádku 3 .
Bohužel nemůžete ovládat MySQL přístupové cesty v DML operace.
Nejlepší, co můžete udělat, je správně indexovat své podmínky a doufat, že MySQL vybere tyto indexy.