एक प्रक्रिया के कारण गतिरोध का शिकार होना


105

मेरे पास 5 से 10 मिनट के आदेश पर चयन करने के लिए एक प्रक्रिया है जिसे समाप्त होने में लंबा समय लगता है।
मैं वर्तमान में MS SQL डेटाबेस इंजन के लिए संकेत के रूप में NOLOCK का उपयोग नहीं कर रहा हूं।
उसी समय हमारे पास एक ही डेटाबेस और समान तालिकाओं में अपडेट और आवेषण करने की एक और प्रक्रिया है।
पहली प्रक्रिया शुरू हो गई है, हाल ही में एक संदेश के साथ समय से पहले समाप्त करने के लिए

SQLEXCEPTION: एक अन्य प्रक्रिया के साथ लॉक संसाधनों पर लेन-देन गतिरोध किया गया था और गतिरोध पीड़ित के रूप में चुना गया है।

यह पहली प्रक्रिया समान स्थितियों में अन्य साइटों पर चल रही है, लेकिन छोटे डेटाबेस के साथ और इस प्रकार प्रश्न में चयनित कथन बहुत कम समय (30 सेकंड या इसके बाद के क्रम पर) लेता है। इन अन्य साइटों में, मुझे इन अन्य साइटों में गतिरोध संदेश नहीं मिलता है। मुझे यह संदेश उस साइट पर भी नहीं मिला, जिसे शुरू में समस्या हो रही थी, लेकिन, मेरा मानना ​​है कि जैसे-जैसे डेटाबेस बड़ा हुआ है, मुझे विश्वास है कि मैंने कुछ सीमा पार कर ली होगी। यहाँ मेरे सवाल हैं:

  1. लेन-देन के लिए लेनदेन करने में लगने वाले समय को संबंधित प्रक्रिया को गतिरोध पीड़ित के रूप में चिह्नित किए जाने की अधिक संभावना हो सकती है।
  2. अगर मैं NOLOCK संकेत के साथ चयन को निष्पादित करता हूं, तो क्या यह समस्या को दूर करेगा?
  3. मुझे संदेह है कि चयनित विवरण में WHERE क्लॉज़ के हिस्से के रूप में जाँच किया गया एक डेटाटाइम फ़ील्ड धीमा लुकअप समय का कारण बन रहा है। क्या मैं इस क्षेत्र के आधार पर एक सूचकांक बना सकता हूं? क्या यह उचित है?

बिंदु 1 का आंशिक उत्तर: टाइमआउट के साथ गतिरोध को भ्रमित न करें। यदि आप एक समय समाप्त हो रहे थे तो एक लेनदेन को समाप्त करने में शामिल समय अन्य के लिए जिम्मेदार हो सकता है। इसके अलावा, यह जानना उपयोगी होगा कि आप किस संसाधन पर गतिरोध कर रहे हैं (क्या यह एक सूचकांक या एक तालिका है?)।
नीलबेल

1
SET DEADLOCK_PRIORITY हाई अलर्ट DATABASE dbname सेट करें MULTI_USER;
gstackoverflow

जवाबों:


128

Q1: लेन-देन में लगने वाले समय के लिए संबंधित प्रक्रिया को गतिरोध पीड़ित के रूप में चिह्नित किए जाने की अधिक संभावना है।

नहीं। चयन पीड़ित है, क्योंकि इसमें केवल डेटा पढ़ा गया था, इसलिए लेन-देन की लागत कम होती है , इसलिए इसे पीड़ित के रूप में चुना जाता है:

डिफ़ॉल्ट रूप से, डेटाबेस इंजन डेडलॉक पीड़ित के रूप में चुनता है जो लेनदेन को चलाने वाले सत्र को कम से कम महंगा होता है । वैकल्पिक रूप से, एक उपयोगकर्ता SET DEADLOCK_PRIORITYबयान का उपयोग करके गतिरोध की स्थिति में सत्रों की प्राथमिकता निर्दिष्ट कर सकता है । DEADLOCK_PRIORITY को LOW, NORMAL, या HIGH पर सेट किया जा सकता है, या वैकल्पिक रूप से रेंज (-10 से 10) में किसी भी पूर्णांक मान पर सेट किया जा सकता है।

Q2। अगर मैं NOLOCK संकेत के साथ चयन को निष्पादित करता हूं, तो क्या यह समस्या को दूर करेगा?

कई कारणों से:

Q3। मुझे संदेह है कि चयनित विवरण में WHERE क्लॉज़ के हिस्से के रूप में जाँच किया गया एक डेटाटाइम फ़ील्ड धीमा लुकअप समय का कारण बन रहा है। क्या मैं इस क्षेत्र के आधार पर एक सूचकांक बना सकता हूं? क्या यह उचित है?

शायद। गतिरोध का कारण लगभग एक खराब अनुक्रमित डेटाबेस होने की संभावना है। 10 मिनट प्रश्न ऐसी संकीर्ण परिस्थितियों में स्वीकार्य हैं, कि मैं 100% निश्चित हूं कि आपके मामले में स्वीकार्य नहीं है।

99% आत्मविश्वास के साथ मैं घोषणा करता हूं कि आपके गतिरोध को अपडेट के साथ विरोधाभासी टेबल स्कैन द्वारा कवर किया गया है। कारण का विश्लेषण करने के लिए गतिरोध ग्राफ पर कब्जा करके शुरू करें । आपको अपने डेटाबेस के स्कीमा का अनुकूलन करने की बहुत संभावना होगी। इससे पहले कि आप कोई संशोधन करें, इस विषय को डिजायनिंग इंडेक्स और उप-लेख पढ़ें ।


आपके संपूर्ण उत्तर के लिए धन्यवाद। मुझे लगता है कि मेरे पास अभी भी एक सवाल है। मुझे केवल एक वातावरण में गतिरोध की स्थिति क्यों मिलेगी और किसी अन्य को नहीं। हालांकि सॉफ्टवेयर समान है। आपका उत्तर बताता है कि चयन क्वेरी को चलाने के लिए समय की लंबाई से कोई फर्क नहीं पड़ता है और यह तथ्य है कि यह प्रति सेलेक्ट क्वेरी है जो प्रक्रिया को विफल कर रही है। लेकिन तब ही क्यों, जब चयन क्वेरी को निष्पादित करने में लंबा समय लगता है?
इलियट

4
क्वेरी की लंबाई को गतिरोध पीड़ित को चुनने में कोई फर्क नहीं पड़ता है । यह कम से कम दो कारकों द्वारा गतिरोध पैदा करने में फर्क करता है: 1) सरल संभावनाएं। क्वेरी जितनी लंबी होगी, समवर्ती अपडेट को ओवरलैप करने और गतिरोध में चलाने की संभावना अधिक होगी। 2) एक बड़ी तालिका पूरी तरह से अलग क्वेरी योजना का उपयोग कर सकती है, जो कि गतिरोध के लिए अतिसंवेदनशील है।
रेमस रूसु

12

यहां बताया गया है कि यह विशेष गतिरोध समस्या वास्तव में कैसे हुई और इसे वास्तव में कैसे हल किया गया। यह एक काफी सक्रिय डेटाबेस है जिसमें 130K लेनदेन प्रतिदिन होता है। इस डेटाबेस में तालिकाओं में अनुक्रमित मूल रूप से क्लस्टर किए गए थे। ग्राहक ने हमें अनुक्रमणिका को गैर-सूचीबद्ध बनाने का अनुरोध किया। जैसे ही हमने किया, गतिरोध शुरू हो गया। जब हमने अनुक्रमित को क्लस्टर के रूप में पुन: स्थापित किया, तो गतिरोध बंद हो गया।


34
कोई समझा सकता है क्यों? (मैजिक सॉल्यूशंस बहुत मददगार नहीं हैं)
OGrandeDiEnne

1
यह आदमी इसे अपने पोस्ट में समझाता है: mssqltips.com/sqlservertip/2517/…
siga0984

6

यहाँ उत्तर एक कोशिश के काबिल हैं, लेकिन आपको अपने कोड की भी समीक्षा करनी चाहिए। विशेष रूप से पॉलीफ़ुन के उत्तर को यहां पढ़ें: SQL सर्वर 2005 और C # एप्लिकेशन में गतिरोध से कैसे छुटकारा पाया जाए?

यह समसामयिक मुद्दे की व्याख्या करता है, और आपके प्रश्नों में "के साथ (updlock)" का उपयोग कैसे आपके गतिरोध की स्थिति को ठीक कर सकता है - वास्तव में आपके कोड क्या कर रहा है पर निर्भर करता है। यदि आपका कोड इस पैटर्न का पालन करता है, तो गंदे रीड्स आदि का सहारा लेने से पहले, यह एक बेहतर समाधान है।


0

हालांकि @ Remus Rusanu के पहले से ही एक उत्कृष्ट जवाब है, मामले में आगे पर एक बेहतर जानकारी की तलाश में है एसक्यूएल सर्वर के डेडलॉक का कारण बनता है और पता लगाने की रणनीतियों, मैं पढ़ने के लिए सुझाव देते हैं होगा ब्रैड McGehee 's SQL सर्वर 2005 प्रोफाइलर का उपयोग करते हुए ट्रैक नीचे गतिरोध कैसे

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