2011-12-05 17 views
69

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

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

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

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

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

+0

SET DEADLOCK_PRIORITY HIGH वैकल्पिक डेटाबेस Dbname SET MULTI_USER; – gstackoverflow

उत्तर

84

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

डिफ़ॉल्ट रूप से, डेटाबेस इंजन के रूप में चुनता है:

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

Q2। यदि मैं एक नोलोक संकेत के साथ चयन निष्पादित करता हूं, तो क्या इससे समस्या दूर हो जाएगी?

सं कई कारणों के लिए:

  • आप पहली बार inconsistent reads हैं ठीक से गतिरोध समाप्त करने के लिए, मूल कारण
  • गंदा पढ़ता की जांच कर प्रयास करना चाहिए।
  • गंदे पढ़ने को निर्दिष्ट करने का उचित तरीका transaction isolation levels
  • का उपयोग करना बेहतर समाधान है: read committed snapshot

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

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

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

+0

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

+3

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

9

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

+12

क्या कोई समझा सकता है क्यों? (जादू समाधान बहुत उपयोगी नहीं हैं) – OGrandeDiEnne

2

यहां दिए गए उत्तरों एक प्रयास के लायक हैं, लेकिन आपको अपने कोड की समीक्षा भी करनी चाहिए। विशेष रूप से यहाँ Polyfun के जवाब का एक पढ़ा है: How to get rid of deadlock in a SQL Server 2005 and C# application?

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

संबंधित मुद्दे

 संबंधित मुद्दे