2012-03-05 30 views
7

कहा जाता है तो रोल रोल करता है मुझे किसी समस्या का सामना करना पड़ रहा है जो मुझे कुछ दिनों के लिए पागल बनाता है, उम्मीद है कि कोई मेरी मदद कर सकता है। यहां यह है;ट्रांज़ेक्शनस्कोप डब्ल्यूसीएफ सेवा विधि के अंदर रोलबैक नहीं करता है, अगर सीधे

मैं प्रदाता के रूप में devart से ऑरैकल के लिए dotConnect का उपयोग कर, ओरेकल डेटाबेस के साथ ईएफ 4 का उपयोग कर रहा हूँ। मेरे पास wcf सेवा विधि है जो नीचे DeleteCabinet विधि को कॉल करती है;

public void DeleteCabinet(string pRID) 
{ 
    using(TransactionScope tranScope = new TransactionScope()) 
    { 
     DBUtils.DeleteCabinetAndShelves(pRecordId); 

     //throw exception to test record not deleted 
     throw new Exception("xxx something has happened test xxx"); 

     tranScope.Complete(); 
    } 
} 

डीबीयूटी.डिलेटी कैबिनेट और शेल्व नीचे जैसा दिखता है;

public void DeleteCabinetAndShelves(string pRecordId) 
{ 
    using(var context = new EdrmEntities()) 
    { 
     var cabinet = context.Cabinets.Include("Shelves").Single(p => p.RID == pCabinetRID); 

     //mark all cabinet shelves for deletion 
     if (cabinet.Shelves != null) 
     { 
      foreach (var tempShelf in cabinet.Shelves.ToList()) 
      { 
       context.DeleteObject(tempShelf); 
      } 
     } 

     //mark cabinet for deletion 
     context.DeleteObject(cabinet); 

     //save 
     context.SaveChanges(); 
    } 
} 

जब मैं DeleteCabinet से फोन अपने परीक्षण परियोजना के भीतर, न कि एक WCF कॉल लेकिन प्रत्यक्ष विधि कॉल, यह ठीक काम करता है। यह अपवाद फेंकता है, और लेनदेन वापस लुढ़का है। इस प्रकार डीबी से

समस्या यह है कि जब मैं क्लाइंट से सेवा विधि (जिसे DeleteCabinet कहते हैं) कहते हैं, तो अपवाद फेंक दिया जाता है, लेकिन रिकॉर्ड डीबी से हटा दिया जाता है। लेनदेन वापस रोल नहीं करता है!

कॉलिंग की तरह लगता है कि डब्ल्यूसीएफ विधि लेनदेन वापस नहीं लेती है, लेकिन यह पागल लगता है (कम से कम मेरे लिए), क्या किसी को यह कारण पता चल रहा है कि यह क्यों हो रहा है?

अग्रिम

+0

मुझे विश्वास है कि यह आपके डब्ल्यूसीएफ बाइंडिंग पर निर्भर करेगा और क्या उनके पास लेनदेन का समर्थन है या नहीं। अपने बाइंडिंग और अपनी डब्ल्यूसीएफ सेवा अनुबंध घोषणाओं को प्रकट करने के लिए अपना प्रश्न अपडेट करें। – Rabid

+0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन चूंकि मेरी सेवा किसी ग्राहक द्वारा शुरू किए गए लेनदेन में भाग नहीं ले रही है (उस अर्थ में कोई डब्ल्यूसीएफ लेनदेन नहीं), तो उन सेटिंग्स को इस परिदृश्य में अप्रासंगिक होना चाहिए। यानी: क्लाइंट कॉल टू सर्विस विधि लेन-देन के अंदर नहीं है, यह वह सर्वर है जो उपर्युक्त जैसा लेनदेन शुरू करता है और पूरा करता है। – rayback2

+1

ओह, मैं देखता हूं, यह अजीब है। क्या आप डब्ल्यूसीएफ को चैनल को गलती करने की अनुमति देते हैं या आप डब्ल्यूसीएफ सेवा कॉल में अपवाद को संभालते हैं और परिणाम को ग्राहक को वापस भेजते हैं? क्या 'EdrmEntities' अपने स्वयं के 'EntityConnection' का निर्माण कर रहा है या क्या यह शायद एक साझा कनेक्शन का उपयोग कर रहा है जिसे स्वचालित रूप से आपके' लेनदेनस्कोप 'के बाहर एक निहित लेनदेन में सूचीबद्ध किया गया है? – Rabid

उत्तर

3

धन्यवाद आप DevArt और DotConnect टैग के साथ अपनी पोस्ट में चिह्नित ... मुझे आश्चर्य है कि अगर यह नहीं बल्कि कुछ WCF/इकाई की रूपरेखा/System.Transactions के लिए निहित से DevArt प्रदाताओं में एक बग है। आप यह देखकर सिद्धांत का परीक्षण कर सकते हैं कि यह ObjectContext के साथ होता है जो अंतर्निहित SQL सर्वर प्रदाता (या यहां तक ​​कि Oracle's own EF provider जिसे हाल ही में रिलीज़ किया गया था) का उपयोग कर रहा है और देखें कि समस्या अभी भी होती है या नहीं। यह एकमात्र चीज है जिसे मैं सोच सकता हूं क्योंकि कोड 100% सही लगता है।

+0

ओरेकल के प्रदाता के साथ प्रयास किया, और यह काम करता प्रतीत होता है। मुझे लगता है कि यह devarts प्रदाता में एक बग था, यह पहले (और तय) से पहले खुला होगा, तो मुझे लगता है कि यह विन्यास के साथ कुछ करने के लिए होना चाहिए। इस मुद्दे के लिए उनकी सहायता टीम से संपर्क करेंगे। ' – rayback2

1

@Rabid के लिए धन्यवाद और रचनात्मक टिप्पणी समस्या हल है @luksans, और यह पता चला है कि यह WCF या devart के प्रदाता गाड़ी जा रहा है

यहाँ से कोई लेना-देना नहीं है बात है; डब्ल्यूसीएफ सेवा (जो रोलबैक नहीं थी), और एकीकरण परीक्षण (जो किया गया) विभिन्न परियोजनाओं के अंदर हैं, इस प्रकार कॉन्फ़िगरेशन फाइलें अलग-अलग हैं। वे अतीत में सिंक से बाहर हो गए, और अंतर Enlist=false भाग में है। तो wcf प्रोजेक्ट की कनेक्शन स्ट्रिंग में Enlist=false है जबकि परीक्षण प्रोजेक्ट नहीं है। इस तरह डब्ल्यूसीएफ लेनदेन में असफलता का भ्रम पैदा हुआ था।

wcf प्रोजेक्ट की कनेक्शन स्ट्रिंग से Enlist=false को हटाने से समस्या ठीक हो गई।