Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Deadlocks no MySQL excluindo linhas


Ao executar DML operações, InnoDB bloqueia todas as linhas verificadas, não correspondidas.

Considere este layout de tabela:
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;

Neste caso, MySQL seleciona RANGE caminho de acesso em id , que considera mais barato que REF em data .

Em uma transação simultânea, você poderá excluir ou atualizar as linhas 6 , 7 , 8 mas não as linhas 1 para 5 uma vez que eles estão bloqueados (apesar do fato de que apenas a linha 2 Foi afetado).

Se você remover id <= 5 da condição acima, você poderá excluir qualquer linha, exceto a linha 3 .

Infelizmente, você não pode controlar o MySQL caminhos de acesso em DML operações.

O melhor que você pode fazer é indexar suas condições corretamente e esperar que o MySQL escolherá esses índices.