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
इन अनुक्रमणिकाओं को चुनेंगे।