2009-08-27 14 views
6

मैं एक लेनदेन बनाना चाहता हूं, उप-लेनदेन में कुछ डेटा लिखना, डेटा वापस पढ़ना, और लेनदेन को रोलबैक करना चाहता हूं।एकाधिक लेनदेनस्कोप समस्या

using(var transaction = new TransactionScope()) 
{ 
    using(var transaction = new TransactionScope()) 
    { 
      // save data via LINQ/DataContext 
      transaction.Complete(); 
    } 
    // Get back for assertions 
    var tempItem = // read data via LINQ/DataContext THROWS EXCEPTION 
} 

लेकिन जब पढ़ने मैं "System.Transactions.TransactionException: आपरेशन लेन-देन के राज्य के लिए मान्य नहीं है।"।

इससे बचने के लिए लेनदेन गुणों को कैसे सेट करना चाहिए?

+0

आप किस डीबी का उपयोग कर रहे हैं? – TheVillageIdiot

+0

माइक्रोसॉफ्ट एसक्यूएल 2005 – boj

+0

मदद मिल सकती है http://stackoverflow.com/questions/2884863/under-what-circumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe

उत्तर

9

यह अपवाद पूर्ण स्टैक ट्रेस के बिना डीबग नहीं किया जा सकता है। संदर्भ के आधार पर इसका एक अलग अर्थ है। आम तौर पर इसका मतलब है कि आप ऐसा कुछ कर रहे हैं जो आपको लेनदेन के अंदर नहीं होना चाहिए, लेकिन डीबी कॉल या स्टैक ट्रेस को देखे बिना कोई भी अनुमान लगा सकता है। कुछ सामान्य कारण मैं के बारे में पता है (और यह कोई व्यापक मुझे यकीन है कि इसका मतलब है से होता है) में शामिल हैं:

  1. एक नेस्टेड TransactionScope भीतर एकाधिक डेटा स्रोतों (यानी अलग कनेक्शन तार) को एक्सेस करना। यह एक वितरित लेनदेन को पदोन्नति का कारण बनता है और यदि आप डीटीसी नहीं चला रहे हैं तो यह असफल हो जाएगा। डीटीसी को सक्षम करने के लिए उत्तर आमतौर पर नहीं है, लेकिन अपने लेनदेन को साफ करने या अन्य डेटा एक्सेस को नए TransactionScope(TransactionOptions.RequiresNew) के साथ लपेटने के लिए है।
  2. TransactionScope के भीतर अनचाहे अपवाद।
  3. कोई भी ऑपरेशन जो अलगाव स्तर का उल्लंघन करता है, जैसे कि पंक्तियों को पढ़ने की कोशिश करना अभी भी डाला/अपडेट किया गया है।
  4. एसक्यूएल डेडलॉक्स; लेन-देन कुछ मामलों में खुद को भी खतरे में डाल सकते हैं, लेकिन यदि # 1 लागू होता है, तो नए लेनदेन में अन्य ऑप्स को अलग करने से आप सावधान नहीं हैं, तो डेडलॉक्स का कारण बन सकता है।
  5. लेनदेन समय समाप्ति।
  6. डेटाबेस से कोई अन्य त्रुटि।

मैं निश्चित रूप से हर संभव कारण पता नहीं है, लेकिन आप पूर्ण स्टैक ट्रेस और अपने कोड में वास्तविक डाटाबेस कॉल पोस्ट अगर मैं एक बार देख ले और आप जानते हैं कि अगर मैं कुछ भी नहीं देख दूँगा।

+0

एंडी, इस उत्तर के लिए धन्यवाद। # 3 पुन: प्रश्न: "अलगाव स्तर का उल्लंघन करने वाला कोई भी ऑपरेशन"। क्या निम्नलिखित अलगाव स्तर का उल्लंघन करेगा? डेक्लेयर (एटीएसओएल) कुछ गणना INT; अद्यतन डीबीओ।कुछ सेट (atSmbol) कुछ गणना = [कुछ गणना] = [कुछ गणना] + 1 कहां आईडी = 123 मेरे उपयोग (atSmbol) में कुछ गणना एक आउटपुट पैरामीटर है। यदि हां, तो क्या यह अलगाव स्तर का उल्लंघन नहीं करेगा? डेक्लेयर (एटीएसओएल) कुछ गणना INT; अद्यतन डीबीओ। कुछ सेट [कुछ गणना] = (atSmbol) कुछ गणना = [कुछ गणना] + 1 कहां आईडी = 123 नोट, ऐसा लगता है कि जब मैं प्रतीक पर उपयोग करता हूं तो मैं अधिसूचना के लिए किसी को टैग करने की कोशिश कर रहा हूं। – Wes

4

आपके पास दो नेस्टेड ट्रांज़ेक्शनस्कोप ऑब्जेक्ट्स हैं ??

और कोई पकड़ने की कोशिश ब्लॉक नहीं।

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

मैं तुम्हें मिल जाएगा विशिष्ट जवाब है कि आप एक सौदे कि कुछ भी शुरू नहीं हुआ है पूरा नहीं कर सकते लगता है, यह एक अमान्य स्थिति में है। क्या आपके पास वास्तव में कोई कोड है जहां आपकी LINQ टिप्पणियां हैं? क्या वास्तव में एक कनेक्शन स्थापित हो जाता है?

+0

हाँ, नेस्ट। लेकिन आपने एमएसडीएन क्यों जोड़ा है? – boj

+0

क्योंकि लिंक किया गया आलेख बताता है कि आपको वह अपवाद क्यों मिल रहा है, शायद? –

+0

@boj: क्योंकि इसमें अच्छी टिप्पणियों के साथ उपयोग का एक उदाहरण है जो बताता है कि क्या होता है और कब। –

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