2016-10-21 8 views
7

मैं निम्नलिखित फैशन में TransactionScope उपयोग कर रहा हूँलेनदेनअबॉर्टेड अपवाद - क्या आप सुरक्षित रूप से फिर से चला सकते हैं?

using (var scope = new TransactionScope()) 
{ 
    using (var conn = SQLHelpers.GetSQLConnection()) 
    { 
      //commands here 
    } 
    scope.Complete(); 
} 

कभी कभी मैं जब scope.Complete() के रूप में लेन-देन को पहले से ही वापस लुढ़का कर दिया गया है बुला एक TransactionAbortedException हो रही है और मैं प्रोफाइलर का इस्तेमाल किया है इस मुद्दे को निर्धारित करने के लिए एक गतिरोध है।

अपवाद लेनदेन (प्रक्रिया आईडी 59) लॉक संसाधनों पर एक और प्रक्रिया के साथ deadlocked था और डेडलॉक पीड़ित के रूप में चुना गया है। लेनदेन फिर से करें।

मैंने बाद पाया गतिरोध का कारण है, लेकिन यह मुझे सोच क्यों इस त्रुटि TransactionAbortedException तो मैं वास्तव में लेनदेन सिर्फ इतना है कि विशेष मामले के लिए फिर से चला सकते हैं अप करने के लिए बुलबुला नहीं किया गया। आंतरिक अपवाद (ओं) में कोई भी जानकारी नहीं थी जो इंगित कर सके कि वास्तविक त्रुटि क्या थी।

क्या लेन-देन को फिर से चलाने के कारण के रूप में TransactionAbortedException का पता लगाना सुरक्षित है?

1) गतिरोध
2) टाइमआउट
3)
4 'कनेक्शन बंद कर दिया गया था') .. अन्य:

अब मैं निम्नलिखित भीतरी अपवाद देखा है के लिए?

इन मामलों में से केवल 1 में लेनदेन को फिर से चलाने के लिए उचित लगता है हालांकि यदि आप रोलबैक की गारंटी देते हैं तो आप सभी मामलों में इसे सामान्यीकृत कर सकते हैं। प्रश्न पूछने के लिए फिर से कहा जा सकता है कि 'एक लेनदेन एबॉर्टेड अपवाद गारंटी लेनदेन वापस लुढ़का गया था'?

+0

क्या आप देखते हैं कि लेनदेन की अंतर्निहित अपवाद एबॉर्टेड एक्सेप्शन एक टाइमआउट है? –

+0

कोई भी 'इनर एक्सेप्शन' नहीं है: 'कम्युनिकेशन ट्रांज़ेक्शन अनुरोध का कोई भी संबंधित BEGIN ट्रांज़ेक्शन नहीं है।' और मुझे यह मिल रहा है क्योंकि मैं 'स्कोप' कॉल करता हूं, जब लेनदेन को डेडलॉक द्वारा वापस ले जाया जाता है – wal

+0

इसे आजमाएं (लेनदेन .Current.TransactionInformation.Status == TransactionStatus.Committed) { स्कोप। पूर्ण(); } –

उत्तर

3

सवाल पूछने के लिए 'गारंटी TransactionAbortedException लेनदेन वापस लुढ़का था एक करता है' फिर से कहा जा सकता है?

TransactionAbortedException के लिए दस्तावेज़ का कहना है: जब एक कार्रवाई एक सौदे कि पहले से ही वापस लुढ़का कर दिया गया है, उदाहरण के लिए पर प्रयास किया गया

यह अपवाद फेंक दिया जाता है, जब आप कॉल करने का प्रयास Commit एक लेनदेन पर विधि जो पहले से ही समाप्त हो चुकी है। लेनदेन और लेन-देन के प्रयासों को करने के लिए प्रयास किए जाने पर यह अपवाद भी फेंक दिया जाता है।

यह एक पुनर्प्राप्ति योग्य त्रुटि है।

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

"यह एक पुनर्प्राप्ति योग्य त्रुटि है", इसलिए यदि आपके लेनदेन की प्रकृति ऐसी है कि इसे पुनः प्रयास करने के लिए समझदारी हो, तो आपको इस अपवाद को पकड़ने के बाद इसे पुनः प्रयास करना चाहिए।

आप पुनः प्रयास करने से पहले कुछ समय के लिए इंतजार कर रहे हैं, जैसे कुछ रिट्रीज़ के आसपास कुछ तर्क पेश करना चाह सकते हैं। और इस प्रतीक्षा समय को बढ़ाएं क्योंकि पुनः प्रयास प्रयासों की संख्या बढ़ जाती है। फिर से प्रयास करने के सभी प्रयास विफल होने पर रीट्रीज़ या कुल पुनः प्रयास समय की एक सीमा है और कुछ समझदार/विफलतापूर्वक विफल करें।

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

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