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.