2014-10-31 12 views
5

मैं निम्नलिखित कोड है कि केवल MSDTC तक जाए बिना चलाने के लिए एक भी संदर्भ का उपयोग करते हुए एक एकल डाटाबेस से छू पाने में असमर्थ हूँ वितरित बाध्य करने और context.SaveChanges() पर एक अपवाद फेंक है:इकाई की रूपरेखा लेन-देन

public void DeleteGroupDetails(int groupId) 
{ 
    // Note there is no ambient tx 
    var thisIsNull = Transaction.Current; 

    using (var scope = new TransactionScope()) 
    { 
     var thisIsNotNull = Transaction.Current; 

     using (var context = new MyDbEntities()) 
     { 
      var deleted = context.tblGroups.Where(x => x.GroupID == groupId); 

      context.tblGroups.RemoveRange(deleted); 

      try 
      { 
       context.SaveChanges(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 
     } 

     //scope.Complete(); 
    } 
} 

नोट:

    : -

    अपवाद "(0x8004D025 HRESULT से अपवाद)> साथी लेनदेन प्रबंधक दूरस्थ/नेटवर्क लेनदेन के लिए अपने समर्थन को अक्षम कर दिया अंतर्निहित प्रदाता ओपन पर असफल रहा।" है।

  • यह एक लॉक डाटाबेस सर्वर मैं MSDTC का उपयोग करने में असमर्थ हूँ के कारण एफई 6 और SQL Server 2005
  • उपयोग कर रहा है
  • मैं POC में TransactionScope उपयोग करने के लिए, क्योंकि इस WCF, जो TransactionScope है निर्मित में चल रहे हो जाएगा चाहते हैं में और मैं लेनदेन प्रबंधन के साथ अपने कोड कूड़े नहीं करना चाहता।
  • इसी परियोजनाओं NHibernate का उपयोग करें और इस समस्या को

कनेक्शन स्ट्रिंग की जरूरत नहीं है है:

connectionstring = "मेटाडाटा = रेस: // /ResourceAccess.MyDb.csdl|res:///ResourceAccess.MyDb.ssdl | res: //*/ResourceAccess.MyDb.msl; प्रदाता = System.Data.SqlClient; प्रदाता कनेक्शन स्ट्रिंग = " डेटा स्रोत = wil-gvpsqldev01; प्रारंभिक कैटलॉग = MyDb; एकीकृत सुरक्षा = सही; एकाधिकActiveResultSets = सच; ऐप = EntityFramework " "प्रदाता नाम =" सिस्टम। डेटा। एंटीटी क्लाइंट "/>

System.Transactions निदान कर रहे हैं:

<E2ETraceEvent> 
    <System> 
     <EventID>0</EventID> 
     <Type>3</Type> 
     <SubType Name="Information">0</SubType> 
     <Level>8</Level> 
     <TimeCreated SystemTime="2014-10-31T14:39:43.0061489Z" /> 
     <Source Name="System.Transactions" /> 
     <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
     <Execution ProcessName="CCS.Host.Console.vshost" ProcessID="64568" ThreadID="13"/> 
     <Channel/> 
     <Computer>xxx</Computer> 
    </System> 
     <ApplicationData> 
      <TraceData> 
       <DataItem> 
        <TraceRecord Severity="Information"> 
         <TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/TransactionCreate</TraceIdentifier> 
         <Description>Transaction Created</Description> 
         <AppDomain>CCS.Host.Console.vshost.exe</AppDomain> 
         <ExtendedData> 
          <TraceSource>[Lightweight]</TraceSource> 
          <TransactionTraceIdentifier> 
          <TransactionIdentifier>2e0814b3-7dd2-4c05-ad69-c3787d95c208:1</TransactionIdentifier> 
          <CloneIdentifier>1</CloneIdentifier> 
          </TransactionTraceIdentifier> 
         </ExtendedData> 
        </TraceRecord> 
       </DataItem> 
      </TraceData> 
     </ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent> 
    <System> 
     <EventID>0</EventID> 
     <Type>3</Type> 
     <SubType Name="Information">0</SubType> 
     <Level>8</Level> 
     <TimeCreated SystemTime="2014-10-31T14:39:43.0181489Z" /> 
     <Source Name="System.Transactions" /> 
     <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
     <Execution ProcessName="CCS.Host.Console.vshost" ProcessID="64568" ThreadID="13"/> 
     <Channel/> 
     <Computer>xxx</Computer> 
    </System> 
    <ApplicationData> 
     <TraceData> 
      <DataItem> 
       <TraceRecord Severity="Information"> 
       <TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/TransactionScopeCreated</TraceIdentifier> 
       <Description>TransactionScope Created</Description> 
       <AppDomain>CCS.Host.Console.vshost.exe</AppDomain> 
       <ExtendedData> 
        <TraceSource>[Base]</TraceSource> 
        <TransactionTraceIdentifier> 
        <TransactionIdentifier>2e0814b3-7dd2-4c05-ad69-c3787d95c208:1</TransactionIdentifier> 
        <CloneIdentifier>2</CloneIdentifier> 
        </TransactionTraceIdentifier> 
        <TransactionScopeResult>CreatedTransaction</TransactionScopeResult> 
       </ExtendedData> 
       </TraceRecord> 
      </DataItem> 
     </TraceData> 
    </ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent> 
    <System> 
     <EventID>0</EventID> 
     <Type>3</Type> 
     <SubType Name="Information">0</SubType> 
     <Level>8</Level> 
     <TimeCreated SystemTime="2014-10-31T14:39:49.1921489Z"/> 
     <Source Name="System.Transactions"/> 
     <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}"/> 
     <Execution ProcessName="CCS.Host.Console.vshost" ProcessID="64568" ThreadID="13"/> 
     <Channel/> 
     <Computer>ccc</Computer> 
    </System> 
    <ApplicationData> 
     <TraceData> 
      <DataItem> 
       <TraceRecord Severity="Information"> 
        <TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/Enlistment</TraceIdentifier> 
        <Description>Enlistment Created</Description> 
        <AppDomain>CCS.Host.Console.vshost.exe</AppDomain> 
        <ExtendedData> 
         <TraceSource>[Lightweight]</TraceSource> 
         <EnlistmentTraceIdentifier> 
          <ResourceManagerId>00000000-0000-0000-0000-000000000000</ResourceManagerId> 
          <TransactionTraceIdentifier> 
           <TransactionIdentifier>2e0814b3-7dd2-4c05-ad69-c3787d95c208:1</TransactionIdentifier> 
           <CloneIdentifier>2</CloneIdentifier> 
          </TransactionTraceIdentifier> 
          <EnlistmentIdentifier>0</EnlistmentIdentifier> 
         </EnlistmentTraceIdentifier> 
         <EnlistmentType>PromotableSinglePhase</EnlistmentType> 
         <EnlistmentOptions>None</EnlistmentOptions> 
        </ExtendedData> 
       </TraceRecord> 
      </DataItem> 
     </TraceData> 
    </ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent > 
    <System > 
     <EventID>0</EventID> 
     <Type>3</Type> 
     <SubType Name="Error">0</SubType> 
     <Level>2</Level> 
     <TimeCreated SystemTime="2014-10-31T14:39:50.8941489Z" /> 
     <Source Name="System.Transactions" /> 
     <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
     <Execution ProcessName="CCS.Host.Console.vshost" ProcessID="64568" ThreadID="13" /> 
     <Channel/> 
     <Computer>ccc</Computer> 
    </System> 
    <ApplicationData> 
     <TraceData> 
      <DataItem> 
       <TraceRecord Severity="Error"> 
        <TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/TransactionException</TraceIdentifier> 
        <Description>TransactionException Thrown</Description> 
        <AppDomain>CCS.Host.Console.vshost.exe</AppDomain> 
        <ExtendedData xmlns="http://schemas.microsoft.com/2004/03/Transactions/TransactionExceptionTraceRecord"> 
         <TraceSource>[Distributed]</TraceSource> 
         <ExceptionMessage>The partner transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D025)</ExceptionMessage> 
        </ExtendedData> 
       </TraceRecord> 
      </DataItem> 
     </TraceData> 
    </ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent > 
    <System > 
     <EventID>0</EventID> 
     <Type>3</Type> 
     <SubType Name="Warning">0</SubType> 
     <Level>4</Level> 
     <TimeCreated SystemTime="2014-10-31T14:39:50.9591489Z" /> 
     <Source Name="System.Transactions" /> 
     <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
     <Execution ProcessName="CCS.Host.Console.vshost" ProcessID="64568" ThreadID="13" /> 
     <Channel/> 
     <Computer>ccc</Computer> 
    </System> 
    <ApplicationData> 
     <TraceData> 
      <DataItem> 
       <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Warning"> 
        <TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/EnlistmentCallbackNegative</TraceIdentifier> 
        <Description>Enlistment Callback Negative</Description> 
        <AppDomain>CCS.Host.Console.vshost.exe</AppDomain> 
        <ExtendedData > 
         <TraceSource>[Lightweight]</TraceSource> 
         <EnlistmentTraceIdentifier> 
         <ResourceManagerId>00000000-0000-0000-0000-000000000000</ResourceManagerId> 
         <TransactionTraceIdentifier> 
          <TransactionIdentifier>2e0814b3-7dd2-4c05-ad69-c3787d95c208:1</TransactionIdentifier> 
          <CloneIdentifier>2</CloneIdentifier> 
         </TransactionTraceIdentifier> 
         <EnlistmentIdentifier>0</EnlistmentIdentifier> 
         </EnlistmentTraceIdentifier><EnlistmentCallback>Aborted</EnlistmentCallback> 
        </ExtendedData> 
       </TraceRecord> 
      </DataItem> 
     </TraceData> 
    </ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent > 
    <System > 
     <EventID>0</EventID> 
     <Type>3</Type> 
     <SubType Name="Warning">0</SubType> 
     <Level>4</Level> 
     <TimeCreated SystemTime="2014-10-31T14:39:50.9601489Z" /> 
     <Source Name="System.Transactions" /> 
     <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
     <Execution ProcessName="CCS.Host.Console.vshost" ProcessID="64568" ThreadID="13" /> 
     <Channel/> 
     <Computer>ccc</Computer> 
    </System> 
    <ApplicationData> 
     <TraceData> 
      <DataItem> 
       <TraceRecord Severity="Warning"> 
        <TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/TransactionAborted</TraceIdentifier> 
        <Description>Transaction Aborted</Description> 
        <AppDomain>CCS.Host.Console.vshost.exe</AppDomain> 
        <ExtendedData > 
         <TraceSource>[Lightweight]</TraceSource> 
         <TransactionTraceIdentifier> 
         <TransactionIdentifier>2e0814b3-7dd2-4c05-ad69-c3787d95c208:1</TransactionIdentifier> 
         </TransactionTraceIdentifier> 
        </ExtendedData> 
       </TraceRecord> 
      </DataIt 
+0

क्या मेज पर कोई ट्रिगर्स हैं, शायद? –

+0

वाह मैंने इसके बारे में भी सोचा नहीं था।बस जांच की और कोई ट्रिगर्स नहीं हैं। –

उत्तर

3

मुद्दा एफई ग्रुप के लिए संस्थाओं हो रही है और फिर संस्थाओं को हटाने के बीच संबंध को बंद करने के साथ था। यह वृद्धि बढ़ रहा था। काम के आसपास खोलने और बंद करने कनेक्शन की नियंत्रित करने के लिए है: EF6 में

http://msdn.microsoft.com/en-us/data/dn456849.aspx

व्यवहार और भविष्य के संस्करणों

EF6 और भविष्य के संस्करणों के लिए हम दृष्टिकोण अपनाया है कि अगर बुला कोड संदर्भ को कॉल करके कनेक्शन खोलने का विकल्प चुनता है। डाटाबेस.कनेक्शन.ऑपन() तो करने के लिए इसका एक अच्छा कारण है और फ्रेमवर्क यह मान लेगा कि यह खोलने और कनेक्शन बंद करने पर नियंत्रण चाहता है और अब नहीं होगा कनेक्शन स्वचालित रूप से बंद करें।

https://petermeinl.wordpress.com/2011/03/13/avoiding-unwanted-escalation-to-distributed-transactions/

यहाँ:

इस व्यवहार मैं मिल सकता है की केवल प्रलेखन इस ब्लॉग प्रविष्टि में तालिका का तात्पर्य है कि कि पहले 2008 तक एसक्यूएल सर्वर के संस्करणों एक से अधिक कनेक्शन हैं बढ़ा जाएगा जहां मैं उतरा:

using System; 
using System.Data; 

namespace Services.ResourceAccess 
{ 
    public class ResourceAccess : IDisposable 
    { 
     private readonly Lazy<MyDbEntities> _context; 

     public ResourceAccess() 
     { 
      _context = new Lazy<MyDbEntities>(() => 
      { 
       var context = new MyDbEntities(); 

       context.Database.Connection.Open(); 

       return context; 
      }); 
     } 

     public void DeleteGroupDetails(int groupId) 
     { 
      var deleted = _context.Value.tblGroupDetails.Where(x => x.GroupID == groupId); 

      _context.Value.tblGroupDetails.RemoveRange(deleted); 

      _context.Value.SaveChanges(); 
     } 

     public void Dispose() 
     { 
      if (_context.IsValueCreated) 
      { 
       if (_context.Value.Database.Connection.State == ConnectionState.Open) 
       { 
        _context.Value.Database.Connection.Close(); 
       } 
      } 
     } 
    } 
} 
+1

मैंने कभी भी ईएफ के इस व्यवहार को एमएसडीटीसी को लात मारने का कारण नहीं देखा है। एक 'लेनदेनस्कोप' के भीतर संदर्भ कनेक्शन को कई बार खोलना और बंद करना पूरी तरह से संभव होना चाहिए। लेकिन एक और सवाल: ट्रांजैक्शनस्कोप का उपयोग क्यों करें जब केवल एक SaveChanges कॉल हो? –

+0

@GertArnold अच्छा सवाल। टीएस के संबंध में यह कोड आखिरकार डब्ल्यूसीएफ में रहता है जो टीएस का उपयोग करता है यदि आप टीएक्स प्रबंधन में निर्मित का उपयोग करते हैं। एक बार जब मैं यह काम कर लेता हूं तो मैंने टीएस को इस विधि से कॉलिंग विधि में स्थानांतरित कर दिया और दूसरे SaveChanges के साथ एक और तरीका कहा। जब मैं किसी समस्या में भाग लेता हूं तो मैं रूट कारण प्राप्त करने के लिए जितना संभव हो सके इसे सरल बनाने की कोशिश करता हूं और ऊपर दिया गया कोड सबसे आसान था, जबकि मैं अभी भी असफल रहा था। मैं आपके पहले प्रश्न के बारे में उत्तर अपडेट करूंगा। –

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