När du utför DML
operationer, InnoDB
låser alla skannade rader, inte matchade.
Tänk på den här tabelllayouten:
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;
I det här fallet, MySQL
väljer RANGE
åtkomstsökväg på id
, som den anser vara billigare än REF
på data
.
I en samtidig transaktion kommer du att kunna ta bort eller uppdatera rader 6
, 7
, 8
men inte raderna 1
till 5
eftersom de är låsta (trots att endast rad 2
påverkades).
Om du tar bort id <= 5
från villkoret ovan kommer du att kunna ta bort valfri rad utom rad 3
.
Tyvärr kan du inte styra MySQL
åtkomstvägar i DML
operationer.
Det bästa du kan göra är att indexera dina villkor ordentligt och hoppas att MySQL
kommer att välja dessa index.