2010-10-05 19 views
8

निरस्त कर दिया गया है यह कोड मुझे त्रुटि देता है: लेनदेन निरस्त कर दिया गया है। अगर मैं 1 नेस्टेड लेन-देन की तुलना में यह फेंक नहीं है2 भाई घोंसला लेनदेनस्कोप देता है: लेनदेन

using(var scope = new TransactionScope()) 
    { 
     repo.Insert(new Foo {Fname = "aaaa"}); 
     using(var s = new TransactionScope()) 
     { 
      repo.Insert(new Foo { Fname = "aaaa" }); 

      //if I remove this transaction it is not going to throw exception 
      using (var aaa = new TransactionScope()) 
      { 
       repo.Insert(new Foo { Fname = "aaaa" }); 
      } 

      using(var ssa = new TransactionScope()) 
      { 
       repo.Insert(new Foo { Fname = "aaaa" }); 
      } 
     } 
    } 

उत्तर

12

क्या बयान त्रुटि फेंक करता है? मुझे लगता है कि यह अंतिम repo.Insert है।

चूंकि आप स्कोप नहीं कॉल करते हैं। पूर्ण(), जब लेन का निपटारा किया जाता है तो लेनदेन रोलबैक (निरस्त) होता है।
आम तौर पर, लेनदेन रोलबैक को एक त्रुटि माना जाता है, इसलिए सभी उच्च स्तरीय लेन-देन भी असामान्य हो जाते हैं (या तुरंत रोलबैक किए जाते हैं)।
तो, अंतिम repo.Insert के लिए उपयोग करने के लिए कोई वैध लेनदेन नहीं है - यही कारण है कि यह एक अपवाद फेंकता है।

2

हाँ, यह काम करेंगे हटा दें। आप स्कोप शामिल करना भूल गए हैं। पूर्ण(); अंत

+0

@ user281180 मैंने इसे उद्देश्य पर किया, मैं इसे प्रतिबद्ध नहीं करना चाहता, और यह मुझे एक त्रुटि फेंकता है – Omu

3

पर आप MSDN से इस उदाहरण की तरह TransactionScopeOption निर्दिष्ट करने की आवश्यकता हो सकती है:

using(TransactionScope scope1 = new TransactionScope()) 
//Default is Required 
{ 
    using(TransactionScope scope2 = new 
     TransactionScope(TransactionScopeOption.Required)) 
    { 
    ... 
    } 

    using(TransactionScope scope3 = new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
    ... 
    } 

    using(TransactionScope scope4 = new 
     TransactionScope(TransactionScopeOption.Suppress)) 
    { 
    ... 
    } 
} 

रेफरी: http://msdn.microsoft.com/en-us/library/ms172152.aspx

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