अनुक्रमित कॉलम के मान को उच्च या निम्न पर सेट करने पर निर्भरता से, ऐसा लगता है कि लॉक वास्तव में इंडेक्स एंट्री पर रखा जा रहा है। डेटाबेस इंजन इंडेक्स को स्कैन करता है, और पहली लॉक की गई प्रविष्टि पर रुक जाता है, इसके जारी होने की प्रतीक्षा करता है।
जब पहला लेन-देन किया जाता है, तो सूचकांक अनलॉक हो जाता है, और प्रतीक्षा लेनदेन सूचकांक को स्कैन करना जारी रखता है। चूंकि मूल्य कम किया गया था, यह अब सूचकांक में पहले है। इसलिए फिर से शुरू किया गया स्कैन इसे नहीं देखता क्योंकि यह पहले ही उस बिंदु को पार कर चुका है।
इसकी पुष्टि करने के लिए, निम्न परीक्षण आज़माएं:
- मान 2 और 3 वाली दो पंक्तियाँ बनाएँ।
- दोनों लेन-देन में,
SELECT ... FOR UPDATE
करें - लेन-देन 1 में, 2 से 1, 3 से 4 में बदलें।
- लेन-देन करें 1.
अगर मेरा अनुमान सही है, तो लेन-देन 2 को केवल 4 वाली पंक्ति लौटानी चाहिए।
यह मेरे लिए एक बग की तरह लगता है, क्योंकि मुझे नहीं लगता कि आपको कभी भी इस तरह के आंशिक परिणाम प्राप्त करने चाहिए। दुर्भाग्य से, इसे Bugs.mysql.com पर खोजना मुश्किल है, क्योंकि खोज करते समय "के लिए" शब्द को अनदेखा कर दिया जाता है क्योंकि यह बहुत छोटा या सामान्य है। यहां तक कि "अपडेट के लिए" उद्धृत करने से भी ऐसे बग नहीं मिलते हैं जिनमें केवल यह वाक्यांश होता है।