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.