Podczas wykonywania DML
operacje, InnoDB
blokuje wszystkie zeskanowane wiersze, które nie są dopasowane.
Rozważ następujący układ tabeli:
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;
W tym przypadku MySQL
wybiera RANGE
ścieżka dostępu na id
, które uważa za tańsze niż REF
na data
.
W równoczesnej transakcji będziesz mógł usunąć lub zaktualizować wiersze 6
, 7
, 8
ale nie wiersze 1
do 5
ponieważ są zablokowane (pomimo faktu, że tylko wiersz 2
został naruszony).
Jeśli usuniesz id <= 5
z powyższego warunku będziesz mógł usunąć dowolny wiersz oprócz wiersza 3
.
Niestety nie możesz kontrolować MySQL
ścieżki dostępu w DML
operacje.
Najlepsze, co możesz zrobić, to właściwie zaindeksować warunki i mieć nadzieję, że MySQL
wybierze te indeksy.