Khi thực hiện DML
hoạt động, InnoDB
khóa tất cả các hàng đã quét, không khớp.
Hãy xem xét bố cục bảng này:
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;
Trong trường hợp này, MySQL
chọn RANGE
đường dẫn truy cập trên id
, mà nó cho là rẻ hơn REF
trên dữ liệu data
.
Trong một giao dịch đồng thời, bạn sẽ có thể xóa hoặc cập nhật các hàng 6
, 7
, 8
nhưng không phải hàng 1
thành 5
vì chúng đã bị khóa (mặc dù thực tế là chỉ có hàng 2
bị ảnh hưởng).
Nếu bạn xóa id <= 5
từ điều kiện trên, bạn sẽ có thể xóa bất kỳ hàng nào trừ hàng 3
.
Rất tiếc, bạn không thể kiểm soát MySQL
đường dẫn truy cập trong DML
hoạt động.
Tốt nhất bạn có thể làm là lập chỉ mục các điều kiện của mình đúng cách và hy vọng rằng MySQL
sẽ chọn các chỉ mục này.