sql >> Database >  >> RDS >> Mysql

Deadlocks bij het verwijderen van rijen in MySQL

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.



  1. Null-waarden vervangen door Unknown in Select-instructie in SQL Server - SQL Server / TSQL-zelfstudie, deel 111

  2. PHP PDO haalt null op

  3. 2 Functies die de maand retourneren vanaf een datum in Oracle

  4. Hoe MySQL-server te starten op Windows XP