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

Deadlocks på MySQL-sletning af rækker

Når du udfører DML operationer, InnoDB låser alle scannede rækker, ikke matchede.

Overvej dette tabellayout:

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;

I dette tilfælde MySQL vælger RANGE adgangssti på id , som den anser for at være billigere end REFdata .

I en samtidig transaktion vil du være i stand til at slette eller opdatere rækker 6 , 7 , 8 men ikke rækker 1 til 5 da de er låst (på trods af at kun række 2 blev påvirket).

Hvis du fjerner id <= 5 fra betingelsen ovenfor, vil du være i stand til at slette enhver række undtagen række 3 .

Desværre kan du ikke kontrollere MySQL adgangsstier i DML operationer.

Det bedste du kan gøre er at indeksere dine forhold korrekt og håbe på, at MySQL vil vælge disse indekser.



  1. Generer sql med underforespørgsel som en kolonne i select-sætning ved hjælp af SQLAlchemy

  2. Konfiguration af PostgreSQL for Business Continuity

  3. Sådan beregnes løbende total i rødforskydning

  4. Sådan ændres PHP/Jquery/Ajax script til at have mere end ét formularfelt postst