आपके परिदृश्य में, मैं स्नैपशॉट के लिए अलगाव स्तर को स्पष्ट रूप से सेट करने की अनुशंसा करता हूं - जो ताले को रोककर लिखने (सम्मिलित और अपडेट) के रास्ते में पढ़ने से रोक देगा, फिर भी पढ़ने वाले अभी भी "अच्छे" होंगे (यानी गंदा डेटा नहीं - यह NOLOCK के समान नहीं है)
आम तौर पर मुझे लगता है कि जहां मेरे प्रश्नों के साथ लॉकिंग समस्याएं हैं, मैं मैन्युअल रूप से लागू लॉक को नियंत्रित करता हूं। जैसे मैं पेज/टेबल लेवल लॉकिंग से बचने के लिए पंक्ति-स्तर के ताले के साथ अपडेट करता हूं, और मेरे पढ़ने को रीडपास्ट पर सेट करता हूं (यह स्वीकार करते हुए कि मुझे कुछ डेटा याद आ सकता है, कुछ परिदृश्यों में जो ठीक हो सकता है) लिंक | संपादित करें | हटाएं | ध्वज
संपादित करें-- सभी टिप्पणियों को उत्तर में मिलाना
अनुकूलन प्रक्रिया के भाग के रूप में, sql सर्वर उस पृष्ठ पर कमिटेड रीड होने से बचता है जिसे वह जानता है कि वह नहीं बदला है, और स्वचालित रूप से कम लॉकिंग रणनीति पर वापस आ जाता है। आपके मामले में, एसक्यूएल सर्वर एक क्रमबद्ध पढ़ने से दोहराने योग्य पढ़ने के लिए चला जाता है।
प्रश्न:अलगाव के स्तर को गिराने के संबंध में उपयोगी जानकारी के लिए धन्यवाद। क्या आप किसी भी कारण के बारे में सोच सकते हैं कि यह पहली बार में Serializable IsolationLevel का उपयोग करेगा, यह देखते हुए कि हम SELECT के लिए एक स्पष्ट लेनदेन का उपयोग नहीं करते हैं - यह हमारी समझ थी कि निहित लेनदेन ReadCommitted का उपयोग करेगा?
ए:डिफ़ॉल्ट रूप से, SQL सर्वर रीड कमिटेड का उपयोग करेगा यदि वह आपका डिफ़ॉल्ट आइसोलेशन स्तर है लेकिन यदि आप अपनी क्वेरी में लॉकिंग रणनीति को अतिरिक्त रूप से निर्दिष्ट नहीं करते हैं, तो आप मूल रूप से sql सर्वर से कह रहे हैं "वह करें जो आपको सबसे अच्छा लगता है, लेकिन मेरी प्राथमिकता प्रतिबद्ध पढ़ा है"। चूंकि SQL सर्वर चुनने के लिए स्वतंत्र है, इसलिए यह क्वेरी को अनुकूलित करने के लिए करता है। (एसक्यूएल सर्वर में अनुकूलन एल्गोरिथ्म बहुत जटिल है और मैं इसे स्वयं पूरी तरह से नहीं समझता)। लेन-देन के भीतर स्पष्ट रूप से निष्पादित नहीं करना, afaik, अलगाव स्तर को प्रभावित नहीं करता है जो sql सर्वर उपयोग करता है।
प्रश्न:एक आखिरी बात, क्या यह उचित लगता है कि SQL सर्वर क्वेरी को अनुकूलित करने के लिए अलगाव स्तर (और संभवतः आवश्यक तालों की संख्या) को बढ़ाएगा? मैं यह भी सोच रहा हूं कि क्या पूल किए गए कनेक्शन का पुन:उपयोग इस पर प्रभाव डालेगा यदि यह अंतिम उपयोग किए गए अलगाव स्तर को विरासत में मिला है?
ए:एसक्यूएल सर्वर "लॉक एस्केलेशन" नामक प्रक्रिया के हिस्से के रूप में ऐसा करेगा। http://support.microsoft.com/kb/323630 से , मैं उद्धृत करता हूं:"माइक्रोसॉफ्ट एसक्यूएल सर्वर गतिशील रूप से निर्धारित करता है कि लॉक एस्केलेशन कब करना है। यह निर्णय लेते समय, SQL सर्वर किसी विशेष स्कैन पर रखे गए ताले की संख्या, पूरे लेनदेन द्वारा आयोजित ताले की संख्या को ध्यान में रखता है, और मेमोरी जो संपूर्ण रूप से सिस्टम में लॉक के लिए उपयोग की जा रही है। आमतौर पर, SQL सर्वर के डिफ़ॉल्ट व्यवहार के परिणामस्वरूप लॉक एस्केलेशन केवल उन बिंदुओं पर होता है जहां यह प्रदर्शन में सुधार करेगा या जब आपको अत्यधिक सिस्टम लॉक मेमोरी को अधिक उचित स्तर तक कम करना होगा हालांकि, कुछ एप्लिकेशन या क्वेरी डिज़ाइन ऐसे समय में लॉक एस्केलेशन को ट्रिगर कर सकते हैं जब यह वांछनीय नहीं है, और बढ़ा हुआ टेबल लॉक अन्य उपयोगकर्ताओं को ब्लॉक कर सकता है"।
हालाँकि लॉक एस्केलेशन बिल्कुल वैसा ही नहीं है जैसा कि एक क्वेरी के तहत चलने वाले आइसोलेशन स्तर को बदलना है, यह मुझे आश्चर्यचकित करता है क्योंकि मुझे उम्मीद नहीं थी कि sql सर्वर डिफ़ॉल्ट आइसोलेशन स्तर की अनुमति से अधिक लॉक लेगा।