मेरे लिए, दस्तावेज़ीकरण थोड़ा अस्पष्ट है:
आंतरिक लॉक करने के तरीके सुझाव देता है कि, कुछ परिस्थितियों में, एक MyISAM तालिका में सम्मिलित करना संभव है, जबकि दूसरा सत्र इससे पढ़ रहा है:
हालांकि, टेबल लॉक करने से जुड़ी समस्याएं एक ऐसी स्थिति दिखाता है जहां चयन पूरा होने तक तालिका लॉक हो जाएगी (यह आपकी स्थिति के साथ फिट बैठती है):
InnoDB तालिका पंक्ति-स्तरीय ताले को लागू करती है, इसलिए पूरी तालिका के बजाय केवल पढ़ी जा रही पंक्ति को ही लॉक किया जाएगा।
केवल दस्तावेज़ीकरण पर निर्भर रहने के बजाय, मैंने एक छोटे से परीक्षण की कोशिश की:
- एक ही संरचना के साथ दो टेबल बनाएं:
table_aऔरtable_b। table_aभरें 500,000 पंक्तियों के साथ।table_aसे डेटा कॉपी करेंtable_b. के लिए एकINSERT INTO ... SELECT. का उपयोग करके बयान।- प्रतिलिपि प्रक्रिया के दौरान,
table_a. में एक नई पंक्ति डालने के लिए दूसरे सत्र का उपयोग करें । - जांचें कि क्या
table_bनया रिकॉर्ड शामिल है।
जब दोनों टेबल जहां MyISAM, table_b कॉपी के बाद नया रिकॉर्ड नहीं था। जब दोनों टेबल जहां InnoDB, table_b में कॉपी के बाद नया रिकॉर्ड शामिल था। मैंने इसे तीन बार दोहराया है, और, जैसा कि अपेक्षित था, परिणाम हर बार समान था।
तो, संक्षेप में, यदि आपकी तालिका MyISAM है, तो इसे लॉक कर दिया जाएगा। यदि यह InnoDB है, तो यह नहीं होगा। बेशक, यह परीक्षण अपडेट पर विचार नहीं करता है, लेकिन मुझे उम्मीद है कि परिणाम समान होंगे।