कैसे पुनरावृत्ति करें "डेटा आंदोलन के कारण NOLOCK के साथ स्कैन जारी नहीं रख सका"


10

मुझे NOLOCKकुछ बड़ी नौकरियों के साथ "डेटा आंदोलन के कारण स्कैन जारी नहीं रख सका ", जो WITH (NOLOCK)चुनिंदा प्रश्नों पर है।

मैं समझता हूं कि डेटा का चयन करने के प्रयास के साथ कुछ करना है जब एक पृष्ठ विभाजन हुआ है जिसके कारण डेटा अब नहीं होना चाहिए जहां यह होना चाहिए था - मुझे लगता है कि मेरे वातावरण में क्या हो रहा है।

मैं इसे कैसे पुन: पेश करूंगा?

मैं त्रुटि को पकड़ने के लिए एक शॉर्ट-टर्म वर्कअराउंड करने की कोशिश कर रहा हूं और ऐसा होने पर पुन: प्रयास करें, लेकिन अगर मैं इसे पुन: उत्पन्न नहीं कर सकता तो मैं इसका परीक्षण नहीं कर सकता। क्या इसके कारण का कोई विश्वसनीय तरीका है?

जब ऐसा होता है, तो क्वेरी को निष्पादित करने से सफलता मिलती है - इसलिए मुझे वास्तव में वास्तविक डेटा या डेटाबेस के स्थायी रूप से भ्रष्ट होने के बारे में कोई चिंता नहीं है। क्वेरी में कुछ तालिकाओं (उनकी अनुक्रमणिकाओं के साथ) को अक्सर गिरा दिया जाता है, फिर से बनाया जाता है, और अक्सर दोबारा खोला जाता है, इसलिए मैं मान रहा हूं कि यह उससे संबंधित कुछ है।

हटाने NOLOCKसे निपटने के लिए मेरा दीर्घकालिक मुद्दा है। NOLOCKवहां पहले कारण रखा गया था कि प्रश्न इतने बुरे थे कि वे दिन-प्रतिदिन के लेनदेन के साथ गतिरोध कर रहे थे, इसलिए NOLOCKगतिरोध (जो काम किया) को रोकने के लिए एक बैंड-सहायता थी। इसलिए मुझे एक बैंड-सहायता पर एक बैंड-सहायता की आवश्यकता है जब तक कि हम एक स्थायी समाधान नहीं कर सकते।

अगर मैं इसे हैलो वर्ल्ड के साथ पुन: पेश कर सकता हूं, तो शायद मैं एक घंटे से भी कम समय में बैंड-सहायता को काम में लाने की योजना बनाऊंगा। खोज-एंड-रिप्लेसमेंट नहीं कर सकते NOLOCK, क्योंकि मुझे ऐप डेडलॉक फिर से मिलना शुरू हो जाएंगे, जो कि मेरे लिए कभी-कभार फेल होने वाली नौकरी से भी बदतर हैं।

रीड प्रतिबद्ध स्नैपशॉट अलगाव का उपयोग करना एक अच्छी संभावना है - मुझे इसके बारे में अधिक जानकारी प्राप्त करने के लिए हमारी डेटाबेस टीम के साथ काम करना होगा। हमारी समस्या का एक हिस्सा यह है कि उस तरह की चीज़ से निपटने के लिए हमारे पास एक SQL सर्वर विशेषज्ञ नहीं है, और मैं अभी उस परिवर्तन को करने के लिए अलगाव के स्तर को अच्छी तरह से नहीं समझता।


1
क्या आपने केवल NOLOCKइन नौकरियों से हटाने पर विचार किया है ? यदि इन प्रश्नों के परिणाम सटीक माने जाते हैं तो 601 आपकी चिंताओं में कम से कम होना चाहिए । पॉल व्हाइट पढ़ने के डेटा का एक विशेष रूप से भयानक उदाहरण दिखाता है जो यहां संभव नहीं होना चाहिए ।
हारून बर्ट्रेंड

3
आप सेट कर सकते हैं DEADLOCK_PRIORITYकरने के लिए LOW, नौकरियों में इतना है कि अगर वहाँ गतिरोध कर रहे हैं, नौकरियों असफल हो जायेगी, और नहीं अनुप्रयोगों। उसके बाद, आप गतिरोधों पर शोध कर सकते हैं और पता लगा सकते हैं कि वे क्यों हो रहे हैं, और उस समस्या को ठीक कर रहे हैं। यह एक बहुत ही सरल समाधान हो सकता है, जैसे कि दो कथनों के क्रम को स्वैप करना। जो भी समस्या है, NOLOCKवह समाधान नहीं है , इसलिए इसे केवल इसलिए आसान होने के लिए मजबूर करने की कोशिश करना बंद करें।
हारून बर्ट्रेंड

@AaronBertrand धन्यवाद, DEADLOCK_PRIORITY के बारे में पता नहीं था - मैं उस पर गौर करूँगा। हमने गतिरोधों पर नज़र रखने की कोशिश की, लेकिन वे विभिन्न प्रतीत होने वाले यादृच्छिक समय पर हुए, और प्रति दिन केवल एक या दो बार, और कभी भी मांग पर प्रतिलिपि प्रस्तुत करने योग्य नहीं हैं - हमारी निर्धारित नौकरियां हर घंटे हजारों प्रश्नों को चलाती हैं, और हमारा ऐप सैकड़ों निष्पादित करता है जब भी यह सिर्फ एक पृष्ठ लोड करता है या कुछ बचाता है, और हम किसी भी क्वेरी को गतिरोध में शामिल नहीं करते हैं। मेरा हमेशा से NOLOCK छोड़ने का कोई इरादा नहीं था, यही वजह है कि हम बेहतर दीर्घकालिक समाधानों पर शोध कर रहे हैं।
wookie23 19

1
आपने उल्लेख किया है कि आप गतिरोध को ट्रैक करने में कठिन समय बिता रहे थे। यह देखते हुए कि आप 2008 R2 में हैं, आप यहां देख सकते हैं: sqlservercentral.com/articles/deadlock/65658 जोनाथन केहियास रिंग बफर से गतिरोध की जानकारी खींचते हैं।
केनेथ फिशर

उत्तर और टिप्पणियाँ अंतर्निहित समस्या को अच्छी तरह से संबोधित करते हैं, लेकिन क्या आप अभी भी इसे एक बौद्धिक अभ्यास के रूप में पुन: पेश करने का तरीका खोजने में रुचि रखते हैं?
जेम्स एल

जवाबों:


8

चूंकि NOLOCK मुद्दों के लिए एक संभावित 'बैंड सहायता' NOLOCK का उपयोग बंद करना और READ_COMMITTED_SNAPSHOT अलगाव का उपयोग करना शुरू करना है, इसलिए मैं आपको केेंद्र लिटिल के साथ http://www.brentozar.com पर ब्लॉग पोस्ट को इंगित करना चाहता हूं : स्नैपशॉट लागू करना या पढ़ा जाना SQL सर्वर में स्नैपशॉट अलगाव: एक गाइड

केंद्र READ_COMMITTED_SNAPSHOT अलगाव स्तर का उपयोग करने के साथ लाभ और जोखिमों पर उचित मात्रा में विवरण प्रदान करता है।

  1. यह अलगाव स्तर डेटाबेस कोड के लिए डिफ़ॉल्ट आइसोलेशन स्तर बन जाता है।
  2. READ_COMMITTED_SNAPSHOT अलगाव स्तर में परिवर्तन करने के लिए आपके पास डेटाबेस में केवल एक उपयोगकर्ता होना चाहिए।
  3. यहां तक ​​कि अगर आप READ_COMMITTED_SNAPSHOT अलगाव का उपयोग करते हैं, तब भी आपको NOLOCK संकेतों को हटाने की आवश्यकता होगी क्योंकि वे डिफ़ॉल्ट को ओवरराइड करते हैं।
  4. आपके कुछ कोड में अच्छी तरह से समस्याएं हो सकती हैं जिन्हें इलाज की आवश्यकता होती है।

कुछ साल पहले हमने एक डेटाबेस पर READ_COMMITTED_SNAPSHOT अलगाव को लागू किया था जो कि गंभीर रूप से अवरुद्ध होने से पीड़ित था । लेकिन एक बार जब हमने अलगाव स्तर को बदल दिया तो हमें कुछ महत्वपूर्ण क्षेत्रों में गतिरोध होने लगे ।

ऐसा क्यों हुआ? क्योंकि पिछले अलगाव स्तर ने भारी अवरोधन का कारण बना, कोड गतिरोध के बिंदु तक "कभी नहीं" पहुंच सकता है। हालाँकि, READ_COMMITTED_SNAPSHOT अलगाव के साथ, प्रश्न आगे बढ़ सकते हैं। हालाँकि, कुछ समय तक प्रतीक्षा न करने वाले लेनदेन का कुछ प्रतिशत गतिरोध शुरू हो गया।

सौभाग्य से हमारे मामले को गतिरोध बिंदुओं को निर्धारित करने और एक अधिक राकेट व्यास के आदेश के लिए टेबलों के एक जोड़े पर अनुक्रमित को समायोजित करके जल्दी से हल किया गया था। इसने हमारी लॉकिंग समस्याओं को बहुत कम कर दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.