जबकि ऊपर दिया गया उत्तर सत्य है कि एक चयन ... अद्यतन के लिए समवर्ती सत्र/लेनदेन को एक ही रिकॉर्ड डालने से रोक देगा, यह पूर्ण सत्य नहीं है। मैं वर्तमान में उसी समस्या से लड़ रहा हूं और इस निष्कर्ष पर पहुंचा हूं कि निम्न कारणों से उस स्थिति में चयन ... अद्यतन के लिए लगभग बेकार है:
एक समवर्ती लेनदेन/सत्र भी उसी रिकॉर्ड/सूचकांक मूल्य पर अद्यतन के लिए एक चयन ... अद्यतन कर सकता है, और MySQL खुशी से तुरंत (गैर-अवरुद्ध) और त्रुटियों को फेंकने के बिना स्वीकार करेगा। बेशक, जैसे ही दूसरे सत्र ने ऐसा किया है, आपका सत्र भी अब रिकॉर्ड नहीं डाल सकता है। न ही आपके और न ही दूसरे सत्र/लेनदेन को स्थिति के बारे में कोई जानकारी मिलती है और वे सोचते हैं कि वे रिकॉर्ड को सुरक्षित रूप से तब तक सम्मिलित कर सकते हैं जब तक कि वे वास्तव में ऐसा करने का प्रयास नहीं करते। सम्मिलित करने का प्रयास करने पर या तो गतिरोध हो जाता है या फिर परिस्थितियों के आधार पर डुप्लीकेट कुंजी त्रुटि हो जाती है।
दूसरे शब्दों में, चयन करें ... अद्यतन के लिए अन्य सत्रों को संबंधित रिकॉर्ड डालने से रोकता है, लेकिन भले ही आप चयन करें ... अद्यतन के लिए और संबंधित रिकॉर्ड नहीं मिला, संभावना है कि आप वास्तव में नहीं कर सकते हैं उस रिकॉर्ड को डालें। IMHO, जो "पहली क्वेरी, फिर सम्मिलित करें" विधि को बेकार कर देता है।
समस्या का कारण यह है कि MySQL वास्तव में . को कोई विधि प्रदान नहीं करता है गैर-मौजूद रिकॉर्ड को लॉक करें। दो समवर्ती सत्र / लेन-देन एक ही समय में "अद्यतन के लिए" गैर-मौजूद रिकॉर्ड को लॉक कर सकते हैं, एक ऐसी चीज जो वास्तव में संभव नहीं होनी चाहिए और जो विकास को और अधिक कठिन बना देती है।
ऐसा लगता है कि इसके आसपास काम करने का एकमात्र तरीका सेमाफोर टेबल का उपयोग करना या सम्मिलित करते समय पूरी तालिका को लॉक करना प्रतीत होता है। संपूर्ण तालिकाओं को लॉक करने या सेमाफोर तालिकाओं का उपयोग करने पर आगे के संदर्भ के लिए कृपया MySQL दस्तावेज़ देखें।
बस मेरे 2 सेंट ...