कहा जाता है तो रोल रोल करता है मुझे किसी समस्या का सामना करना पड़ रहा है जो मुझे कुछ दिनों के लिए पागल बनाता है, उम्मीद है कि कोई मेरी मदद कर सकता है। यहां यह है;ट्रांज़ेक्शनस्कोप डब्ल्यूसीएफ सेवा विधि के अंदर रोलबैक नहीं करता है, अगर सीधे
मैं प्रदाता के रूप में 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 कहते हैं) कहते हैं, तो अपवाद फेंक दिया जाता है, लेकिन रिकॉर्ड डीबी से हटा दिया जाता है। लेनदेन वापस रोल नहीं करता है!
कॉलिंग की तरह लगता है कि डब्ल्यूसीएफ विधि लेनदेन वापस नहीं लेती है, लेकिन यह पागल लगता है (कम से कम मेरे लिए), क्या किसी को यह कारण पता चल रहा है कि यह क्यों हो रहा है?
अग्रिम
मुझे विश्वास है कि यह आपके डब्ल्यूसीएफ बाइंडिंग पर निर्भर करेगा और क्या उनके पास लेनदेन का समर्थन है या नहीं। अपने बाइंडिंग और अपनी डब्ल्यूसीएफ सेवा अनुबंध घोषणाओं को प्रकट करने के लिए अपना प्रश्न अपडेट करें। – Rabid
अगर मैं गलत हूं, तो मुझे सही करें, लेकिन चूंकि मेरी सेवा किसी ग्राहक द्वारा शुरू किए गए लेनदेन में भाग नहीं ले रही है (उस अर्थ में कोई डब्ल्यूसीएफ लेनदेन नहीं), तो उन सेटिंग्स को इस परिदृश्य में अप्रासंगिक होना चाहिए। यानी: क्लाइंट कॉल टू सर्विस विधि लेन-देन के अंदर नहीं है, यह वह सर्वर है जो उपर्युक्त जैसा लेनदेन शुरू करता है और पूरा करता है। – rayback2
ओह, मैं देखता हूं, यह अजीब है। क्या आप डब्ल्यूसीएफ को चैनल को गलती करने की अनुमति देते हैं या आप डब्ल्यूसीएफ सेवा कॉल में अपवाद को संभालते हैं और परिणाम को ग्राहक को वापस भेजते हैं? क्या 'EdrmEntities' अपने स्वयं के 'EntityConnection' का निर्माण कर रहा है या क्या यह शायद एक साझा कनेक्शन का उपयोग कर रहा है जिसे स्वचालित रूप से आपके' लेनदेनस्कोप 'के बाहर एक निहित लेनदेन में सूचीबद्ध किया गया है? – Rabid