Lors de l'exécution de DML
opérations, InnoDB
verrouille toutes les lignes analysées, sans correspondance.
Considérez cette disposition de tableau :
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;
Dans ce cas, MySQL
sélectionne RANGE
chemin d'accès sur id
, qu'il considère moins cher que REF
sur les data
.
Dans une transaction simultanée, vous pourrez supprimer ou mettre à jour les lignes 6
, 7
, 8
mais pas les lignes 1
à 5
puisqu'ils sont verrouillés (malgré le fait que seule la ligne 2
a été affecté).
Si vous supprimez id <= 5
à partir de la condition ci-dessus, vous pourrez supprimer n'importe quelle ligne sauf la ligne 3
.
Malheureusement, vous ne pouvez pas contrôler MySQL
chemins d'accès en DML
opérations.
Le mieux que vous puissiez faire est d'indexer correctement vos conditions et d'espérer que MySQL
choisira ces index.