2009-08-28 17 views
32

मैं लेन-देन के लिए सेट करने के लिए इस्तेमाल का उपयोग कर TransactionOptions.Timeout द्वारा टाइमआउट, लेकिन config दृष्टिकोण का उपयोग करने के रखरखाव में आसानी के लिए फैसला किया है:डिफ़ॉल्ट लेन-देन समय समाप्त

<system.transactions> 
    <defaultSettings timeout="00:01:00" /> 
    </system.transactions> 
बेशक

इस में डालने के बाद, मैं चाहता था परीक्षण करने के लिए यह काम कर रहा था, इसलिए टाइमआउट को 5 सेकंड तक कम कर दिया, फिर एक परीक्षण चलाया जो इस से अधिक समय तक चला - लेकिन लेनदेन निरस्त नहीं होता! यदि मैं ट्रांज़ेक्शनऑप्शन सेट करने के लिए टेस्ट समायोजित करता हूं। टाइमआउट 5 सेकंड तक, परीक्षण

जांच के बाद मुझे लगता है कि समस्या ट्रांज़ेक्शनऑप्शन से संबंधित प्रतीत होती है। टाइमआउट, भले ही मैं इसका उपयोग नहीं कर रहा हूं।

मुझे अभी भी ट्रांज़ेक्शनऑप्शन का उपयोग करने की आवश्यकता है, इसलिए मैं अलगाव लेवल सेट कर सकता हूं, लेकिन अब मैं टाइमआउट मान सेट नहीं करता हूं, अगर मैं इसे बनाने के बाद इस ऑब्जेक्ट को देखता हूं, टाइमआउट मान 00:00:00 है, जो अनंतता के बराबर है । क्या इसका मतलब है कि कॉन्फ़िगरेशन फ़ाइल में मेरा मान सेट अनदेखा किया जा रहा है?

संक्षेप में:

  • यह config की स्थापना, और TransactionOptions
  • यदि नहीं के उपयोग के मिश्रण करने के लिए असंभव है, वहाँ किसी भी तरह से config रनटाइम पर की स्थापना को निकालने के लिए है, और उपयोग टाइमआउट संपत्ति
  • [संपादित करें] या ट्रांज़ेक्शनऑप्शन
  • का उपयोग किए बिना डिफ़ॉल्ट अलगाव-स्तर सेट करें
+0

क्या कॉन्फ़िग फ़ाइल में आप इस स्थापित किया था: त्वरित संदर्भ के लिए, यहाँ TransactionScope निर्माता ये हैं? किस विन्यास खंड में? – PVitt

+0

सीधे root के अंतर्गत app.confing में। Web.config में भी, लेकिन उपर्युक्त परीक्षण app.config के लिए था। – MattH

उत्तर

44

आप syst मिश्रण कर सकते हैं em.transaction विन्यास सेटिंग्स और TransactionOption वर्ग का उपयोग, लेकिन कुछ चीजें हैं जिनके बारे में आपको अवगत होना चाहिए।

आप TransactionOption और एक Timeout मान निर्दिष्ट उपयोग करते हैं, कि मूल्य system.transactions/defaultTimeout मूल्य से अधिक उपयोग किया जाएगा।

उपरोक्त आपके मामले में समस्या का क्रूक्स है जो मुझे लगता है। अलगाव स्तर निर्दिष्ट करने के लिएका उपयोग कर रहे हैं, और साइड इफेक्ट के रूप में आपको अनंत टाइमआउट मान प्राप्त हो रहा है क्योंकि TransactionOption के लिए असीमित डिफ़ॉल्ट टाइमआउट मान निर्दिष्ट नहीं है। हालांकि, मुझे पूरा यकीन नहीं है कि यह क्यों है ... डिफ़ॉल्ट लेनदेन समय समाप्ति पर डिफ़ॉल्ट रूप से यह समझ में आता है।

आप अपने स्वयं के लेनदेन विकल्प सहायक वर्ग को कार्यान्वित कर सकते हैं जिसमें ऐप.कॉन्फिग (यदि पाया जाता है) से पढ़े गए डिफ़ॉल्ट या ट्रांज़ेक्शनऑप्शन क्लास के लिए उचित मानों के लिए डिफ़ॉल्ट शामिल हैं।

किसी भी मामले में, आप अभी भी सिस्टम का उपयोग करके इसे सीमित कर सकते हैं। ट्रांसलेशन/मशीन सेटिंग्स/अधिकतम समय मान। यह एक प्रशासनिक सेटिंग है और केवल machine.config के माध्यम से कॉन्फ़िगर किया जा सकता है। यदि आप इसे ऐप/web.config से आज़माते हैं तो आपको कॉन्फ़िगरेशन अपवाद प्राप्त होगा।

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

maxTimeout सेट के साथ, कोई बात नहीं क्या टाइमआउट मान आपके द्वारा निर्दिष्ट अधिकतम मूल्य maxTimeout मूल्य तक ही सीमित रहेगा। डिफ़ॉल्ट maxTimeout 00:10:00, या 10 मिनट है, इसलिए आपके पास वास्तव में लेनदेन पर असीमित टाइमआउट नहीं होगा।

आप लेनदेन के भीतर उपयोग किए जा रहे डेटाबेस कनेक्शन पर लेनदेन अलगाव लेवल स्पष्ट रूप से भी सेट कर सकते हैं। कुछ इस तरह?

var connectionString = "Server=.;Database=master;Trusted_Connection=True;"; 

      using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
      { 
       using (var conn = new SqlConnection(connectionString)) 
       { 
        conn.Open(); 
        var sqlTransaction = conn.BeginTransaction(System.Data.IsolationLevel.Serializable); 

        // do database work 
        // 
        sqlTransaction.Commit(); 


       } 

       // do other work.. 
       // 

       scope.Complete(); 

      } 

आपके परीक्षण में, आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि आप पुनर्निर्माण करें ताकि app.config पुन: उत्पन्न हो सके। मेरे परीक्षण में, ऐसा प्रतीत होता है कि मुझे सिस्टम लेने के लिए * .vshost.exe प्रक्रिया को समाप्त करने की आवश्यकता है। ट्रांसलेशन कॉन्फ़िगरेशन सेटिंग बदलती है - हालांकि मुझे लगता है कि यह एक झलक हो सकता है। बस fyi ..

1

मेरे वर्तमान विचारों को नीचे रख करने के लिए:

  • यह config की स्थापना, और TransactionOptions के उपयोग
  • कार्यावधि में config सेटिंग को निकालने के लिए एक ही रास्ता एप्लिकेशन को पढ़ने के लिए है मिश्रण करना असंभव है। एक एक्सएमएल फ़ाइल के रूप में config
  • डिफ़ॉल्ट अलगाव स्तर के केवल लेन-देन विकल्पों के माध्यम से किया जा सकता है, या WCF में सेवा के स्तर पर गुण
  • का उपयोग कर
+1

दूसरे बुलेट बिंदु पर: कॉन्फ़िगरेशन फ़ाइल तक पहुंचने के लिए एक एपीआई है।इसे करने के लिए एक तरफ मेरे जवाब में कोड देखें। आपको इसे एक XML फ़ाइल के रूप में पढ़ने का सहारा नहीं लेना है। –

6

ट्रांज़ेक्शनऑप्शन का उपयोग होने पर कॉन्फ़िगरेशन फ़ाइल सेटिंग को अनदेखा किया जाता है। एक लेनदेनस्कोप बनाना, ज्यादातर मामलों में, CommittableTransaction का एक उदाहरण बना देगा। CommittableTransaction का कोई तर्क कन्स्ट्रक्टर कॉन्फ़िगरेशन फ़ाइल सेटिंग का डिफ़ॉल्ट टाइमआउट के रूप में उपयोग नहीं करेगा। ट्रांजैक्शनस्कोप कन्स्ट्रक्टर जो लेनदेन विकल्प या टाइमस्पेन लेते हैं, वे CommittableTransaction क्लास के ओवरलोड में से एक को कॉल करेंगे, न कि कोई तर्क संस्करण। तो यदि आप उस मान का उपयोग करना चाहते हैं तो आपको इसे कॉन्फ़िगर फ़ाइल से खुद को पकड़ना होगा।

जब मैं इसमें भाग गया तो मैंने निम्नलिखित कोड को थोड़ा लेनदेनऑप्शन फैक्ट्री क्लास में रखा।


Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
ConfigurationSectionGroup sectionGroup = configuration.GetSectionGroup("system.transactions"); 
DefaultSettingsSection defaultSettings = (DefaultSettingsSection) sectionGroup.Sections["defaultSettings"]; 
TransactionOptions options = new TransactionOptions(); 
options.Timeout = defaultSettings.Timeout; 
options.IsolationLevel = IsolationLevel.ReadCommitted; 
+0

माफी माइक, मैं आपको बक्षीस से सम्मानित करता, लेकिन मैं स्पष्ट रूप से बकाया समय सीमा के पीछे एक घंटा था। यह समाधान मेरी समस्या को बहुत अच्छी तरह से हल करेगा। शर्म आइए इस पर स्पष्ट नहीं है। – MattH

+0

कोई चिंता नहीं मैटएच। मुझे खुशी है कि इससे मदद मिली। –

46

आप TransactionManager.DefaultTimeout का उपयोग कर कॉन्फ़िगरेशन से (मान्य) डिफ़ॉल्ट टाइमआउट प्राप्त कर सकते हैं।

TransactionOptions एक ऐसी संरचना है जो टाइमआउट और अलगाव स्तर को समाहित करती है।जब एक struct आरंभ डिफ़ॉल्ट निर्माता का उपयोग कर, यह हमेशा उनके डिफ़ॉल्ट मानों के struct सदस्यों को प्रारंभ करेंगे:

TransactionOptions transactionOptions = new TransactionOptions(); 
transactionOptions.Timeout == default(TimeSpan); // TimeSpan.Zero 
transactionOptions.IsolationLevel == default(IsolationLevel); // IsolationLevel.Serializable 

आप एक IsolationLevel निर्दिष्ट और डिफ़ॉल्ट टाइमआउट उपयोग करना चाहते हैं:

new TransactionOptions() 
{ 
    IsolationLevel = IsolationLevel.Serializable, // Use whatever level you require 
    Timeout = TransactionManager.DefaultTimeout 
}; 
+0

यह वह उत्तर था जिसे मैं हमेशा उम्मीद कर रहा था! दुर्भाग्य से मेरे लिए आपको जवाब देने में बहुत देर हो चुकी है, लेकिन TransactionManager.DefaultTimeout निश्चित रूप से मैं चाहता था। पोस्ट करने का शुक्रिया! – MattH

+1

मैंने यह भी ध्यान दिया कि माइक्रोसॉफ्ट भी इस तकनीक का उपयोग [सिस्टम पर लेनदेन] [http://msdn.microsoft.com/en-us/library/ms973865.aspx) में करता है। उपयोगी जानकारी के लिए धन्यवाद! –

+0

ILSpy में FWIW Groveling .NET 4.0 में 1 मिनट का डिफ़ॉल्ट दिखाता है, याद रखें कि यह एक कार्यान्वयन विवरण है, इसलिए परिवर्तन के अधीन है, उपरोक्त का उपयोग इस मान को दोबारा जांचने के लिए करें !: // System.Transactions.Configuration.DefaultSettingsSection [कॉन्फ़िगरेशनप्रॉपर्टी ("टाइमआउट", डिफॉल्ट वैल्यू = "00:01:00"), टाइमस्पैन वैलिडेटेटर (मिनवैल्यूस्ट्रिंग = "00:00:00", मैक्सवेल्यूस्ट्रिंग = "10675199.02: 48: 05.4775807")] – aolszowka

9

प्रति परावर्तक , TransactionScope के रचनाकारों के साथ लेन-देन का समय निर्धारित करने के लिए मूल नियम निम्नानुसार हैं:

डिफ़ॉल्ट समय Out से नीचे है कि संतुष्ट है पहला नियम से निर्धारित होता है:

  • अगर निर्माता एक TimeSpan पैरामीटर है, DefaultTimeout कि पैरामीटर
  • अगर निर्माता एक TransactionOption पैरामीटर है है, DefaultTimeout transactionOption.TimeOut
  • है
  • यदि निर्माता के पास TransactionScopeOption पैरामीटर है, तो डिफॉल्टटाइमआउट scopeOption.TimeOut
  • यदि निर्माता के पास टाइमआउट पैरामीटर नहीं है, तो डिफ़ॉल्ट टाइमआउट ऐप या वेब कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट मान है।
  • अन्यथा, DefaultTimeOut 1 मिनट है।

MaxTimeOut जब तक एक और मूल्य machine.config में निर्दिष्ट किया जाता 10 मिनट है।

लेनदेन के लिए प्रभावी टाइमआउट मैक्सटाइमऑट और डिफॉल्टटाइमऑट से छोटा है जो शून्य से अधिक है। यदि मैक्सटाइमऑट और डिफॉल्टटाइम दोनों शून्य हैं, तो प्रभावी टाइमआउट long.MaxValue (अनंतता) द्वारा दर्शाए गए टिकों की संख्या है।

यदि TransactionScope उदाहरण एक नया लेनदेन नहीं बनाता है या तो लेनदेन अपने कन्स्ट्रक्टर में पास हो जाता है, या क्योंकि लेनदेन के दायरे के विकल्प की आवश्यकता नहीं होती है (उदाहरण के लिए, जब परिवेश लेनदेन मौजूद होता है और लेनदेन स्कोपऑप्शन आवश्यक है) लेकिन एक timeOut पैरामीटर अभी भी निर्माता में पारित किया गया है, एक टाइमर शुरू हो गया है। जब टाइमआउट अवधि समाप्त हो जाती है, अंतर्निहित लेनदेन की TimeOut() विधि कहा जाता है। इस मामले में DefaultTimeOut और MaxTimeOut गुणों का उपयोग नहीं किया जाता है।

यदि transactionScopeOption == TransactionScopeOption.Supress है, तो टाइमआउट को अनदेखा किया जाता है और इसका कोई प्रभाव नहीं पड़ता है।

यह भी संभव एप्लिकेशन/वेब कॉन्फ़िग फ़ाइल में MaxTimeOut परिभाषित करने के लिए, अगर machine.config के प्रासंगिक अनुभागों ओवरराइड की गई है (allowDefintion के मूल्यों ध्यान दें और allowExeDefinition गुण) है:

<sectionGroup name="system.transactions" type="System.Transactions.Configuration.TransactionsSectionGroup, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"> 
    <section name="defaultSettings" type="System.Transactions.Configuration.DefaultSettingsSection, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/> 
    <section name="machineSettings" type="System.Transactions.Configuration.MachineSettingsSection, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" allowDefinition="MachineToApplication" allowExeDefinition="MachineToApplication"/> 
</sectionGroup> 

public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout, EnterpriseServicesInteropOption interopOption); 
public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions, EnterpriseServicesInteropOption interopOption); 
public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions); 
public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout); 
public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout); 
public TransactionScope(TransactionScopeOption scopeOption); 
+0

बहुत बढ़िया जवाब! – buckley

1
void Main() 
{ 
    var maximumTimeout = TransactionManager.MaximumTimeout;//This step is necessary to init _maximumTimeout value, 

    FieldInfo fieldInfo = typeof(TransactionManager).GetFields(BindingFlags.NonPublic | BindingFlags.Static).Single(item => item.Name == "_maximumTimeout"); 
    var customMaximumTimeout = TimeSpan.FromHours(1); 
    fieldInfo.SetValue(null, customMaximumTimeout); 
    maximumTimeout = TransactionManager.MaximumTimeout; 

    Console.WriteLine(maximumTimeout);//01:00:00 
    // use TransactionScope 
} 
+0

फ्रांज संक्षेप में बताता है - आप प्रतिबिंब के साथ ऐसा कर सकते हैं। मुझे इस एमएसडीएन आलेख की टिप्पणियों में एक और विधि मिली: http://blogs.msdn.com/b/ajit/archive/2008/06/18/override-the-system-transactions-default-timeout-of-10- मिनट-इन-द-कोड.aspx # 10417962 - दुर्भाग्यवश मेरी कंपनी में देवओप्स की स्थिति काफी नहीं है जो मुझे चाहिए, इसलिए मेरे पास सभी प्रोसेसिंग नोड्स पर machine.config को अपडेट करने का कोई आसान तरीका नहीं है और सेटिंग्स को भविष्य में लागू किया गया है। प्रतिबिंब का उपयोग करना मेरे लिए एक अच्छा कामकाज है। –

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