2012-07-12 8 views
46

का निपटारा नहीं किया गया है मुझे लेनदेन में एकाधिक डेटाबेस प्रश्नों को लपेटने के लिए TransactionScope का उपयोग करने में समस्या हो रही है, मैं बैचसाइज 500 के साथ एसक्लबल्ककॉपी का उपयोग कर रहा हूं। जब मैंने बैच बढ़ाया connection ब्लॉक के बाहरत्रुटि - वर्तमान कनेक्शन से जुड़े लेनदेन को पूरा कर लिया गया है लेकिन

using (var scope = new TransactionScope()) 
{ 
    using (var connection = (SqlConnection)customerTable.OpenConnection()) 
    { 
     var table1BulkCopy = new SqlBulkCopy(connection) 
     { 
      BatchSize = BATCH_SIZE, 
      DestinationTableName = TableName1 
     }; 

     table1BulkCopy.WriteToServer(table1DataTable); 

     var table2BulkCopy = new SqlBulkCopy(connection) 
     { 
      BatchSize = BATCH_SIZE, 
      DestinationTableName = TableName2 
     }; 

     table2BulkCopy.WriteToServer(table2DataTable); 

     var table3BulkCopy = new SqlBulkCopy(connection) 
     { 
      BatchSize = BATCH_SIZE, 
      DestinationTableName = TableName3 
     }; 

     table1BulkCopy.WriteToServer(table3DataTable); 

     var table4BulkCopy = new SqlBulkCopy(connection) 
     { 
      BatchSize = BATCH_SIZE, 
      DestinationTableName = TableName4 
     }; 

     table4BulkCopy.WriteToServer(table4DataTable); 

     scope.Complete(); 
    } 
} 

उत्तर

7

ले जाएँ scope.Complete();:

The transaction associated with the current connection has completed but has not been disposed. The transaction must be disposed before the connection can be used to execute SQL statements.

इस कोड मैं का उपयोग कर रहा है: आकार 1000 तक मैं त्रुटि हो रही है।

using (var scope = new TransactionScope()) 
{ 
    using (var connection = (SqlConnection)customerTable.OpenConnection()) 
    { 
    // 
    } 
    scope.Complete(); 
} 
+0

यहाँ और अधिक जानकारी क्यों:

...allowDefinition="MachineToApplication" 

यह एक अच्छा arcticle है: तो फिर machine.config में आप velue गुण सेट करना चाहिए? कॉल को उपयोग ब्लॉक में अंतिम कथन के रूप में रखना बहुत अच्छा अभ्यास है। [विधि के बारे में अधिक जानकारी] (https://msdn.microsoft.com/es-es/library/system.transactions.transactionscope.complete (v = vs.110) .aspx) – Angel

+1

इससे मदद मिली। आवंटित –

85

मुझे पता है कि यह देर हो चुकी है, लेकिन शायद यह किसी और की मदद करेगी।

यह तब हो सकता है जब लेनदेन का समय समाप्त हो जाए। आप इस तरह के अपने लेनदेन के लिए टाइमआउट बढ़ा सकते हैं (अपने लेनदेन की अपेक्षित लंबाई के लिए उपयुक्त मूल्यों का उपयोग करें)। नीचे दिए गए कोड 15 मिनट के लिए है:

using (TransactionScope scope = 
      new TransactionScope(TransactionScopeOption.Required, 
            new System.TimeSpan(0, 15, 0))) 
    { 
     // working code here 
    } 

यही कारण है कि यह नहीं 1000

+0

मुझे यह 'टाइमआउट = लेनदेन प्रबंधक। मैक्सिमटाइमआउट' के साथ मिल रहा है, इसलिए यह त्रुटि एकमात्र तरीका नहीं हो सकता है। –

+0

इस उत्तर में एक समस्या तय की गई थी जो मैं कर रहा था। चूंकि @ एरिक जे ने इसका उल्लेख नहीं किया कि यह त्रुटि एकमात्र तरीका हो सकती है, लेकिन यदि आपके लेन-देन के समय आपको उपरोक्त असंबंधित संदेश प्राप्त करते हैं। – b0redom

+0

@ प्रदीप यह सही उत्तर है और इसे चिह्नित किया जाना चाहिए। – Kiquenet

17

के लिए मैंने पाया कि TransactionScope में समय-समाप्ति सेट मेरे लिए काम नहीं किया batchsize 500 के लिए काम किया है और हो सकता था। मुझे 10 मिनट के डिफ़ॉल्ट अधिकतम टाइमआउट के विस्तार के लिए machine.config <configuration> टैग के अंत में निम्न कॉन्फ़िगरेशन कुंजी जोड़ने की भी आवश्यकता है।

<system.transactions> 
    <machineSettings maxTimeout="00:30:00" /> <!-- 30 minutes --> 
</system.transactions> 

क्रेडिट: http://thecodesaysitall.blogspot.com.au/2012/04/long-running-systemtransactions.html

+0

ध्यान दें कि आपको इसे * कॉन्फ़िगरेशन अनुभाग के * end * पर रखना होगा, अन्यथा आपको आईआईएस से एक त्रुटि मिलेगी। –

0

पूरा जवाब अधिक पूर्ण होना चाहिए।

आप निर्दिष्ट करना होगा - जहां अधिकतम लेन-देन का समय समाप्त निर्धारित किया जाएगा - नेट कोड में, या सर्वर config

<sectionGroup name="system.transactions".... 
    ...allowDefinition="MachineOnly" 
</sectionGroup> 

इस मामले में आप machine.config में अधिकतम समय समाप्ति सेट कर सकते हैं

<configuration> 
<system.transactions> 
<machineSettings maxTimeout="01:00:00" /> 
</system.transactions> 
</configuration> 

या हो सकता है कि आप इस बीहाइवर को एप्लिकेशन में ओवरराइड करना चाहें। https://blogs.msdn.microsoft.com/ajit/2008/06/18/override-the-system-transactions-default-timeout-of-10-minutes-in-the-code/

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

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