Saat melakukan DML operasi, InnoDB mengunci semua baris yang dipindai, tidak cocok.
Pertimbangkan tata letak tabel ini:
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;
Dalam hal ini, MySQL memilih RANGE jalur akses di id , yang dianggap lebih murah daripada REF pada data .
Dalam transaksi bersamaan, Anda akan dapat menghapus atau memperbarui baris 6 , 7 , 8 tapi bukan baris 1 ke 5 karena terkunci (meskipun faktanya hanya baris 2 terpengaruh).
Jika Anda menghapus id <= 5 dari kondisi di atas, Anda dapat menghapus baris apa pun kecuali baris 3 .
Sayangnya, Anda tidak dapat mengontrol MySQL jalur akses di DML operasi.
Yang terbaik yang dapat Anda lakukan adalah mengindeks kondisi Anda dengan benar dan berharap MySQL akan memilih indeks ini.