2013-02-19 49 views
6

जब मैं डेटाबेस में डेटा सहेजता हूं तो मैंने ट्रांज़ेक्शनस्कोप को अलगाव लेवल सेट सेरियलज़ेबल में सेट किया था।ट्रांजैक्शनस्कोप अलगाव लेवल को लेनदेन को पूरा करने के बाद बदलें

TransactionOptions options = new TransactionOptions 
     { 
      IsolationLevel=IsolationLevel.Serializable 
     }; 


using (var transaction = new TransactionScope(TransactionScopeOption.Required,options)) 
{ 
    transation.Complete(); 
} 

अब के बाद निष्पादन खत्म हो गया है, मैं TransactionScopeIsolationLevel बदलना चाहते हैं।

संपादित

क्या मुझे समझ में है यह, IsolationLevel Serializable फिर लेन-देन पूरा करने के बाद, कनेक्शन वस्तु बंद कर दिया और कनेक्शन पूल में लौटने और जब कुछ अन्य अनुरोध आता है इसे से उस कनेक्शन वस्तु लाने के लिए सेट है, तो पूल और इस प्रकार पिछले अलगाव लेवल द्वारा प्रभावित। तो मैं प्रत्येक लेनदेन के बाद अलगाव स्तर को डिफ़ॉल्ट में बदलना चाहता हूं।

उत्तर

5

आप सही हैं: पूल से कनेक्शन लौटने पर अलगाव स्तर रीसेट नहीं किया जाता है। इस भयानक व्यवहार है, लेकिन हम इसके साथ अटक रहे हैं ...

दो रणनीतियां हैं:

  1. लौटने से पहले अलगाव स्तर रीसेट: यह आपके दृष्टिकोण है।
  2. हमेशा एक स्पष्ट लेनदेन (या लेनदेनस्कोप) के साथ कनेक्शन का उपयोग करें ताकि अलगाव स्तर की गारंटी हो।

मैं आपको बाद वाले करने की सलाह देता हूं।

यदि आप (1) करने पर जोर देते हैं तो आप TransactionScope को बंद करने के बाद अलगाव स्तर को आसानी से बदल सकते हैं लेकिन आपको कनेक्शन ऑब्जेक्ट के साथ ऐसा करना होगा। उदाहरण:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    using (var transaction = new TransactionScope(TransactionScopeOption.Required,options)) 
    { 
     connection.Open(); //open inside of scope so that the conn enlists itself 
     transation.Complete(); 
    } 
    //conn is still open but without transaction 
    conn.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL XXX"); //pseudo-code 
} //return to pool 

क्या यह आपके लिए काम करता है?

+0

प्रतिक्रिया के लिए धन्यवाद, मैं अन्य बेहतर विकल्पों को स्वीकार करने के लिए तैयार हूं, लेकिन आप एक स्पष्ट लेनदेन के साथ सभी कनेक्शन खोलने का सुझाव दे रहे हैं, आपको नहीं लगता कि यह सिस्टम में बहुत सारे ओवरहेड लाएगा। मेरे पास सैकड़ों अंत अंक हैं, लेकिन केवल कुछ परिदृश्य हैं जहां मैं ट्रांज़ेक्शनस्कोप का उपयोग कर रहा हूं। ऐसी चीजों के लिए आप क्या सुझाव देते हैं? – MegaMind

+0

लेनदेन ओवरहेड लगभग कुछ भी नहीं है क्योंकि सभी कथन किसी भी तरह के निहित लेनदेन का उपयोग करते हैं .; यदि आप सब कुछ माइग्रेट नहीं कर सकते हैं तो आपका दृष्टिकोण वास्तव में एक अच्छा विचार हो सकता है। एक हैक, लेकिन एक व्यावहारिक समाधान। मैं इसके साथ कोई बड़ी समस्या नहीं देख सकता। – usr

+0

conn.ExecuteCommand ("सेट ट्रांज़ेक्शन इशोलेशन लेवल XXX") करता है; काम? क्या किसी ने कोशिश की है? – hazimdikenli

2

मैं इससे थोड़ा सा रहा हूं। सौभाग्य से कनेक्शन स्ट्रिंग तर्क केंद्रीकृत किया गया था। लेनदेन.क्यूरेंट शून्य नहीं है (जो दर्शाता है कि हम एक लेनदेनस्कोप के अंदर हैं) कनेक्शन कनेक्शन स्ट्रिंग की एप्लिकेशन सेटिंग को बदलने के लिए मैंने क्या किया था।

इस प्रकार ट्रांज़ेक्शनस्कोप कनेक्शन दूसरों के साथ पूल नहीं करते हैं।