सबसे पहले, यदि आप MySQL के InnoDB स्टोरेज इंजन पर डिफॉल्ट करते हैं, तो कोई तरीका नहीं है कि आप बिना रो लॉक के डेटा को अपडेट कर सकते हैं, सिवाय ट्रांजेक्शन आइसोलेशन लेवल को READ UNCOMMITTED रन करके सेट करने के अलावा
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
हालांकि, मुझे नहीं लगता कि डेटाबेस व्यवहार वह है जो आप उम्मीद करते हैं क्योंकि इस मामले में गंदे पढ़ने की अनुमति है। पढ़ें UNCOMMITTED व्यवहार में शायद ही कभी उपयोगी होता है।
@Tim से उत्तर को पूरक करने के लिए, जहां क्लॉज में उपयोग किए गए कॉलम पर एक अद्वितीय अनुक्रमणिका रखना वास्तव में एक अच्छा विचार है। हालांकि, कृपया यह भी ध्यान दें कि इस बात की कोई पूर्ण गारंटी नहीं है कि ऑप्टिमाइज़र अंततः बनाए गए इंडेक्स का उपयोग करके ऐसी निष्पादन योजना का चयन करेगा। यह काम कर सकता है या नहीं, यह मामले पर निर्भर करता है।
आपके मामले के लिए, आप क्या कर सकते हैं कि लंबे लेनदेन को कई छोटे लेनदेन में विभाजित करना है। एक शॉट में लाखों पंक्तियों को अपडेट करने के बजाय, हर बार केवल हजारों पंक्तियों को स्कैन करना बेहतर होगा। X लॉक तब जारी किए जाते हैं जब प्रत्येक छोटा लेन-देन करता है या रोलबैक करता है, समवर्ती अपडेट को आगे बढ़ने का अवसर देता है।
वैसे, मुझे लगता है कि आपके बैच की प्राथमिकता अन्य ऑनलाइन प्रक्रियाओं की तुलना में कम है, इस प्रकार प्रभाव को और कम करने के लिए इसे पीक आवर्स से बाहर शेड्यूल किया जा सकता है।
पी.एस. IX लॉक रिकॉर्ड पर ही नहीं है, लेकिन उच्च-ग्रैन्युलैरिटी टेबल ऑब्जेक्ट से जुड़ा हुआ है। और यहां तक कि रिपीटेबल रीड ट्रांजैक्शन आइसोलेशन स्तर के साथ, जब क्वेरी एक अद्वितीय इंडेक्स का उपयोग करती है तो कोई गैप लॉक नहीं होता है।