Ist das ein innodb Gap Lock Bug?
TRX1 select * from Tabelle, wo refId = 4 for update
TRX2 in Tabelle einfügen (refId) -Werten (2); Block
trx2 wird blockiert, ich wusste, dass trx1 es Lückensperre halten wird, [1,4), [4,7);
meine Frage ist, warum Lückensperre halten? "insert val 2" ist kein Konflikt "where refId = 4 for update", warum innodb Lückensperrung beibehalten wird, warum nicht record-lock verwenden?
diese Frage stört mich schon lange, bitte tech gott rette mich.
ja, das ist richtig, void Phantom Zeilen, wie folgt Ihrem Test, fügen Sie eine andere Zeile mit refId = 4, solange trx1 die Zeile Datensatz sperren (oder nicht Gap-Sperre), Sie können einfügen refId = 4, und leere Phantomzeilen; meine Frage, warum Gap-Lock zu Block-Einsatz halten RefId = 1,2,3,5,6, nicht nur 4. Fühlen Sie sich das ist Mysql Bug? –
Ich denke, Gap-Lock-Arbeit auf dieser sql "Select * aus der Tabelle, wo refId <10 für update", Gap-Lock wird Blockierung refId = 1,2,3,4,5,6,7 zu void Phantom Zeilen blockieren; Es sollte Arbeit Bereichssuche Bedingung, nicht gleich Bedingung. –
danke für deine antwort. –