Mysql
 sql >> Database >  >> RDS >> Mysql

Deadlock su MySQL che elimina le righe

Quando si esegue DML operazioni, InnoDB blocca tutte le righe scansionate, non abbinate.

Considera questo layout della tabella:

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 questo caso, MySQL seleziona RANGE percorso di accesso su id , che considera più economico di REF su data .

In una transazione simultanea, potrai eliminare o aggiornare le righe 6 , 7 , 8 ma non le righe 1 a 5 poiché sono bloccati (nonostante il fatto che solo la riga 2 è stato colpito).

Se rimuovi id <= 5 dalla condizione sopra, sarai in grado di eliminare qualsiasi riga tranne la riga 3 .

Sfortunatamente, non puoi controllare MySQL percorsi di accesso in DML operazioni.

La cosa migliore che puoi fare è indicizzare correttamente le tue condizioni e sperare che MySQL sceglierà questi indici.