Mysql
 sql >> Base de données >  >> RDS >> Mysql

Interblocages sur MySQL en supprimant des lignes

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.