विशुद्ध रूप से सैद्धांतिक दृष्टिकोण से, ऐसा लगता है कि आप सही पंक्तियों को लॉक नहीं कर रहे हैं (अपडेट स्टेटमेंट की तुलना में पहले स्टेटमेंट में अलग स्थिति; इसके अलावा आप LIMIT 1
के कारण केवल एक पंक्ति को लॉक करते हैं। , जबकि आप संभवतः बाद में और पंक्तियों को अपडेट करते हैं)।
इसे आजमाएं:
START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;
[संपादित करें]
आपके गतिरोध के कारण के लिए, यह संभावित उत्तर है (मैन्युअल से ):
अनुक्रमणिका के बिना, SELECT ... FOR UPDATE
स्टेटमेंट के पूरे टेबल को लॉक करने की संभावना है, जबकि एक इंडेक्स के साथ, यह केवल कुछ पंक्तियों को लॉक करता है। चूंकि आपने पहले कथन में सही पंक्तियों को लॉक नहीं किया था, इसलिए दूसरे कथन के दौरान एक अतिरिक्त लॉक प्राप्त किया जाता है।
जाहिर है, अगर पूरी टेबल लॉक है (यानी बिना इंडेक्स के) तो डेडलॉक नहीं हो सकता। दूसरे सेटअप में एक डेडलॉक निश्चित रूप से हो सकता है।