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.