2010-01-13 15 views
14

मैं सी # में एक एप्लीकेशन लिख रहा हूं जो SQL सर्वर 2005 डेटाबेस तक पहुंचता है। एप्लिकेशन काफी डेटाबेस गहन है, और यहां तक ​​कि यदि मैं सभी एक्सेस को अनुकूलित करने का प्रयास करता हूं, तो उचित इंडेक्स सेट अप करें और इसलिए मुझे उम्मीद है कि मुझे जल्दी या बाद में डेडलॉक्स मिलेंगे। मुझे पता है कि डाटाबेस डेडलॉक्स क्यों होते हैं, लेकिन मुझे संदेह है कि मैं कुछ समय पर बिना किसी खतरे के सॉफ़्टवेयर को रिलीज़ कर पाऊंगा। एप्लिकेशन डेटाबेस पहुंच के लिए इकाई फ्रेमवर्क का उपयोग कर रहा है।सी # में एसक्यूएल डेडलॉक को संभालने के लिए पैटर्न?

क्या सी # क्लाइंट कोड में SQLExceptions (deadlocked) को संभालने के लिए कोई अच्छा पैटर्न है - उदाहरण के लिए x मिलीसेकंड के बाद कथन बैच को फिर से चलाने के लिए?

स्पष्ट करने के लिए; मैं पहली जगह में मृतकों से बचने के तरीकों की तलाश नहीं कर रहा हूं (अलगाव स्तर, इंडेक्स, बयानों का क्रम इत्यादि) बल्कि वास्तव में उन्हें संभालने के तरीके को कैसे संभालना है।

उत्तर

4

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

रैंडी

+1

पर बताया है क्या आप मुझे बता सकते हैं कि आपने लेनदेन की वास्तविक पुनरावृत्ति कैसे की? क्या आपने प्रत्येक स्थान पर कोड के चारों ओर एक साधारण फॉर-लूप रखा था जहां आपने लेनदेन किया था या क्या आप अधिक सामान्य समाधान के साथ आए थे? – martin

+1

हमने एक लूप लागू किया। अगर लेनदेन विफल हो गया, तो डेडलॉक स्थिति की वजह से, हमने पूरे लेन-देन को वापस ले लिया, और फिर 5 बार तक कोशिश की। –

6

मैं बिल्कुल यह एक समय पहले संभालने के लिए एक कोड नमूना तैनात हैं, लेकिन ऐसा अंतरिम में अपने खाते खो तो मैं नहीं मिल सकता है यह अब मुझे डर लग रहा है और नहीं है लग रहा था कोड मैं यहाँ इस्तेमाल किया।

लघु जवाब - एक try..catch में बात लपेट दें। यदि आपको एक त्रुटि होती है जो डेडलॉक की तरह दिखती है, तो एक छोटे से यादृच्छिक समय के लिए सोएं और काउंटर को फिर से प्रयास करें। अगर आपको कोई और त्रुटि मिलती है या पुनः प्रयास काउंटर आपके थ्रेसहोल्ड को साफ़ करता है, तो कॉलिंग रूटीन में त्रुटि को वापस फेंक दें।

(और अगर आप एक सामान्य दिनचर्या में इस डाट और इसलिए आप संभाल रहे गतिरोध यह माध्यम से चलाने के सबसे/अपने डीबी पहुँच के सभी कार्यक्रम चौड़ा करने की कोशिश कर सकते हैं।)

संपादित करें: आह, मुझे सिखाने Google का उपयोग न करें! पिछले कोड नमूना I और अन्य ने How to get efficient Sql Server deadlock handling in C# with ADO?

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