निष्पादन समय समाप्त क्यों हो रहा है यह समझने के लिए आपको सर्वर की ओर से इसकी जांच करने की आवश्यकता है। ध्यान दें कि सर्वर का कोई टाइमआउट नहीं है, टाइमआउट डिफ़ॉल्ट 30 सेकंड के कारण SqlCommand.CommandTimeout
।
एक अच्छा संसाधन है वेट्स एंड क्यूज़ , जो SQL सर्वर के साथ प्रदर्शन बाधाओं का निदान करने के लिए एक पद्धति है। टाइमआउट के वास्तविक कारण के आधार पर उचित कार्रवाई की जा सकती है। आपको सबसे पहले और सबसे महत्वपूर्ण यह स्थापित करना होगा कि आप धीमे निष्पादन (एक खराब योजना) से निपट रहे हैं या अवरुद्ध कर रहे हैं।
अगर मैं अनुमान लगाता हूं, तो मैं कहूंगा कि IF EXISTS... UPDATE
का अस्वस्थ पैटर्न मूल कारण है। यह पैटर्न गलत है और समवर्ती के तहत विफलताओं का कारण बनेगा। IF EXISTS
को क्रियान्वित करने वाले दो समवर्ती लेनदेन एक साथ दोनों एक ही निष्कर्ष पर पहुंचेंगे और दोनों INSERT
. का प्रयास करें या UPDATE
. डेटाबेस में बाहर निकलने वाली बाधाओं के आधार पर आप एक डेडलॉक (भाग्यशाली मामला) या खोए हुए लेखन (दुर्भाग्यपूर्ण मामले) के साथ समाप्त हो सकते हैं। हालांकि, केवल उचित जांच से ही वास्तविक मूल कारण का पता चलेगा। कुछ पूरी तरह से अलग हो सकता है, जैसे ऑटो-ग्रोथ इवेंट
।
आपकी प्रक्रिया भी CATCH ब्लॉक को गलत तरीके से हैंडल कर रही है। आपको हमेशा . होना चाहिए XACT_STATE()
चेक करें
क्योंकि आपका CATCH ब्लॉक चलने तक लेन-देन पहले ही वापस ले लिया जा सकता है। यह भी स्पष्ट नहीं है कि आप लेन-देन के नामकरण से क्या उम्मीद करते हैं, यह एक सामान्य गलती है जिसे मैं अक्सर बचत बिंदुओं के साथ भ्रमित नामित लेनदेन से जुड़ा देखता हूं। सही पैटर्न के लिए देखें अपवाद हैंडलिंग और नेस्टेड लेनदेन
ए> ।
संपादित करें
इसकी जांच करने का एक संभावित तरीका यहां दिया गया है:
- संबंधित
CommandTimeout
से 0 (अर्थात अनंत)। blocked process threshold
को सक्षम करें , इसे 30 सेकंड (पूर्व कमांडटाइमआउट) पर सेट करें- प्रोफाइलर में मॉनिटर अवरुद्ध प्रोसेस रिपोर्ट इवेंट के लिए
- अपना कार्यभार प्रारंभ करें
- देखें कि प्रोफाइलर कोई रिपोर्ट इवेंट तैयार करता है या नहीं। अगर ऐसा होता है, तो वे कारण का पता लगाएंगे।
इन कार्रवाइयों के कारण हर बार एक 'अवरुद्ध प्रक्रिया रिपोर्ट' घटना होगी, यदि आपको समयबाह्य समय मिल जाता, यदि समयबाह्य अवरोधन के कारण होता। यदि अवरोध एक लाइव-लॉक तो यह हमेशा के लिए प्रतीक्षा करेगा।