sql >> Databasteknik >  >> RDS >> Mysql

Deadlocks på MySQL raderar rader

När du utför DML operationer, InnoDB låser alla skannade rader, inte matchade.

Tänk på den här tabelllayouten:

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 det här fallet, MySQL väljer RANGE åtkomstsökväg på id , som den anser vara billigare än REFdata .

I en samtidig transaktion kommer du att kunna ta bort eller uppdatera rader 6 , 7 , 8 men inte raderna 1 till 5 eftersom de är låsta (trots att endast rad 2 påverkades).

Om du tar bort id <= 5 från villkoret ovan kommer du att kunna ta bort valfri rad utom rad 3 .

Tyvärr kan du inte styra MySQL åtkomstvägar i DML operationer.

Det bästa du kan göra är att indexera dina villkor ordentligt och hoppas att MySQL kommer att välja dessa index.



  1. Vilken är den bästa metoden för att skicka parametrar till SQLCommand?

  2. MERGE:Uppdatering av käll- och måltabeller som finns på separata servrar

  3. MySql varchar ändring från Latin1 till UTF8

  4. Varför placera MySQL-uppgifter utanför www-katalogen?