2011-05-28 18 views
7

मैं कुछ बैच डालने और अपडेट करने के लिए TransactionScope का उपयोग कर रहा हूं। समस्या यह है कि, जब मैं TransactionScope के टाइमआउट को एक घंटे में सेट करता हूं तब भी मुझे 30 मिनट लंबे ऑपरेशन पर टाइमआउट अपवाद मिल रहा है।लेनदेनस्कोप टाइमआउट समय से पहले होता है?

अपवाद के बाद भी यह बैच के रिकॉर्ड की यादृच्छिक राशि दर्ज करता है। उदाहरण के लिए अंतिम ऑपरेशन में 12440 आवेषण थे और समय-समय पर तालिका में 7673 रिकॉर्ड डाले गए थे।

SqlConnection और SqlCommand का समय दोनों int.MaxValue पर सेट हैं।

मैं क्या गलत कर रहा हूं?

using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromHours(1))) 
{ 
     try 
     { 
       using (db = new DB()) 
       { 
       //operations here 
       } 
     } 
     catch (Exception ex) 
     { 
       throw new Exception("DB Error:\r\n\r\n" + ex.Message); 
     } 

     transaction.Complete(); 
} // <--- Exception here: Transaction aborted (Inner exception: Timeout) 
+1

एक बड़ा (और संभवतः अधिक महत्वपूर्ण) प्रश्न यह है कि "कुछ दस हजार इंसर्ट इतने लंबे समय क्यों लेते हैं?" –

+0

यह एक * कमांड टाइमआउट * हो सकता है (और इस प्रकार एक * लेनदेनस्कोप टाइमआउट * के लिए एक लाल हेरिंग हो रहा है)? यह "यादृच्छिकता" की व्याख्या करेगा, और रिकॉर्डों को ध्यान में रखते हुए * बहुत * धीरे-धीरे डाला जाता है ... मुझे लगता है कि प्रश्न 'मैक्सवेल्यू' पर सेट है, लेकिन मुझे संदेह है कि समस्या यह नहीं है। –

+0

@ मिच: यह एक बहुत धीमी कनेक्शन पर एक अलविदा किया जाता है। इसलिए एक घंटा टाइमआउट सीमा :) @pst: लूप में सम्मिलित किया जाता है। प्रत्येक पुनरावृत्ति कमांडटेक्स्ट सेट करता है और निष्पादित करता है। तो यह एक बड़े एसक्यूएल के परिणाम का इंतजार नहीं कर रहा है, मुझे संदेह है कि यह एक कमांड टाइमआउट है। इसके अलावा मैं केवल एसक्यूएलकनेक्शन और एसक्लोकॉमैंड के साथ एक बहुत ही सरल डीएएल का उपयोग करता हूं, मुझे कुछ और समय नहीं दिख रहा है। मैं खुशी से किसी अन्य चीज की जांच कर सकता हूं जो आप सुझा सकते हैं? – dstr

उत्तर

8

क्या आपका लेनदेन 10 मिनट के बाद विफल रहा है? यदि ऐसा है, तो आप शायद Transaction Manager Maximum Timeout पर क्लिक कर रहे हैं जो machine.config में सेट है। यदि मैं सही ढंग से याद करता हूं, यदि आप अधिकतम मान से अधिक टाइमआउट सेट करने का प्रयास करते हैं तो आपकी सेटिंग को अनदेखा कर दिया जाएगा। Machine.config में मान को ऊपर उठाने का प्रयास करें और देखें कि क्या इससे आपकी समस्या में मदद मिलती है।

यादृच्छिक कामों के मामले में आप अपनी कनेक्शन स्ट्रिंग पर Transaction Binding=Explicit Unbind सेट करते हैं? डिफ़ॉल्ट मान Transaction Binding=Implicit Unbind है। MSDN से:

अंतर्निहित Unbind लेनदेन जब यह सिरों से अलग करने के लिए कनेक्शन कारण बनता है। अलग होने के बाद, कनेक्शन पर अनुरोध ऑटोोकॉमिट मोड में किए गए हैं। System.Transactions.Transaction.Current लेनदेन सक्रिय होने पर अनुरोधों को निष्पादित करते समय संपत्ति की जांच नहीं की जाती है। लेनदेन के बाद समाप्त हो गया है, अतिरिक्त अनुरोध ऑटोोकॉमिट मोड में किए गए हैं।

असल में, जब लेनदेन बार बाहर सभी आवेषण उस समय तक वापस लुढ़का दिया जाएगा, लेकिन किसी भी अतिरिक्त इसी कनेक्शन से किया आवेषण autocommit मोड जहां हर डालने बयान तुरंत प्रतिबद्ध हो जाएगा में किया जाएगा। यह आपके द्वारा देखे जा रहे परिदृश्य के समान ध्वनि करता है (लेकिन पूर्ण कोड/रेपो को देखे बिना जानना मुश्किल है)।

2

मैं अगर तुम SqlBulkCopy Class उपयोग कर सकते हैं देखेंगे:

यहाँ मेरी कोड है। यह बहुत तेज़ होना चाहिए, और लंबे समय तक की आवश्यकता को खत्म कर सकता है।

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