При изпълнение на DML
операции, 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;
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;
В този случай MySQL
избира RANGE
път за достъп до id
, което смята за по-евтино от REF
на data
.
При едновременна транзакция ще можете да изтривате или актуализирате редове 6
, 7
, 8
но не и редове 1
до 5
тъй като са заключени (въпреки факта, че само ред 2
е бил засегнат).
Ако премахнете id <= 5
от условието по-горе, ще можете да изтриете всеки ред освен ред 3
.
За съжаление не можете да контролирате MySQL
пътища за достъп в DML
операции.
Най-доброто, което можете да направите, е да индексирате правилно вашите условия и да се надявате, че MySQL
ще избере тези индекси.