Bij het uitvoeren van DML operaties, InnoDB vergrendelt alle gescande rijen, niet overeenkomend.
Overweeg deze tafelindeling:
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;
In dit geval MySQL selecteert RANGE toegangspad op id , die het als goedkoper beschouwt dan REF op data .
In een gelijktijdige transactie kunt u rijen 6 . verwijderen of bijwerken , 7 , 8 maar niet rijen 1 tot 5 omdat ze vergrendeld zijn (ondanks het feit dat alleen rij 2 getroffen).
Als u id <= 5 . verwijdert van de bovenstaande voorwaarde, kunt u elke rij verwijderen, behalve rij 3 .
Helaas heb je geen controle over MySQL toegangspaden in DML operaties.
Het beste wat u kunt doen, is uw voorwaarden goed indexeren en hopen dat MySQL zal deze indexen kiezen.