sql >> Databáze >  >> RDS >> Mysql

Zablokování na MySQL při mazání řádků

Při provádění DML operace, InnoDB uzamkne všechny naskenované řádky, které se neshodují.

Zvažte toto rozložení tabulky:

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;

V tomto případě MySQL vybere RANGE přístupová cesta na id , které považuje za levnější než REF na data .

V souběžné transakci budete moci smazat nebo aktualizovat řádky 6 , 7 , 8 ale ne řádky 15 protože jsou uzamčeny (navzdory skutečnosti, že pouze řádek 2 byl ovlivněn).

Pokud odeberete id <= 5 z výše uvedené podmínky budete moci smazat libovolný řádek kromě řádku 3 .

Bohužel nemůžete ovládat MySQL přístupové cesty v DML operace.

Nejlepší, co můžete udělat, je správně indexovat své podmínky a doufat, že MySQL vybere tyto indexy.



  1. SQL UNION Cheat Sheet s 10 snadnými a užitečnými tipy

  2. Hledání duplicitních řádků na serveru SQL Server

  3. Vkládání do tabulky v pořadí

  4. Jak v PHP s PDO zkontrolovat finální parametrizovaný dotaz SQL?