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 rows पंक्तियों को हटाने या अपडेट करने में सक्षम होंगे , 7 , 8 लेकिन पंक्तियाँ नहीं 1 करने के लिए 5 चूंकि वे बंद हैं (इस तथ्य के बावजूद कि केवल पंक्ति 2 प्रभावित हुआ था)।
अगर आप id <= 5 . हटाते हैं उपरोक्त शर्त से, आप 3 row के अलावा किसी भी पंक्ति को हटा सकेंगे ।
दुर्भाग्य से, आप MySQL को नियंत्रित नहीं कर सकते DML . में पहुंच पथ संचालन।
सबसे अच्छा आप यह कर सकते हैं कि अपनी शर्तों को ठीक से अनुक्रमित करें और आशा करें कि MySQL इन अनुक्रमणिकाओं को चुनेंगे।