DML
を実行する場合 操作、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;
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;
この場合、MySQL
RANGE
を選択します id
のアクセスパス 、REF
よりも安いと見なされます data
。
コンカレントトランザクションでは、行6
を削除または更新できます。 、7
、8
行ではありません1
5
へ ロックされているため(2
の行のみであるにもかかわらず 影響を受けました。
id <= 5
を削除した場合 上記の条件から、行3
以外の行を削除できます。 。
残念ながら、MySQL
を制御することはできません DML
のアクセスパス 操作。
最善の方法は、条件に適切なインデックスを付けて、MySQL
を期待することです。 これらのインデックスを選択します。