2013-07-18 5 views
5

के बिना एक ही सर्वर पर एकाधिक डेटाबेस (डेटाकॉन्टेक्स्ट) मैं SQL Server 2008 के साथ EF5.0 का उपयोग कर रहा हूं। मेरे पास एक ही सर्वर उदाहरण पर दो डेटाबेस हैं। मुझे दोनों डेटाबेस पर टेबल अपडेट करने की आवश्यकता है और उन्हें एक ही लेनदेन करना चाहते हैं। तो मैंने ट्रांज़ेक्शनस्कोप का इस्तेमाल किया। नीचे कोड है -एमएस डीटीसी

public void Save() 
{ 
     var MSObjectContext = ((IObjectContextAdapter)MSDataContext).ObjectContext; 
     var AWObjectContext = ((IObjectContextAdapter)AwContext).ObjectContext; 

     using (var scope = new TransactionScope(TransactionScopeOption.Required, 
              new TransactionOptions 
               { 
                IsolationLevel = IsolationLevel.ReadUncommitted 
               })) 
     {    
      MSObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave); 
      AWObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave); 

      scope.Complete(); 
     } 
    } 

जब मैं उपरोक्त कोड का उपयोग करता हूं लेनदेन को डीटीसी में पदोन्नत किया जाता है। इंटरनेट पर खोज करने के बाद मैंने पाया कि यह दो अलग-अलग कनेक्शनस्ट्रिंग/कनेक्शन के कारण होता है। लेकिन मैं समझ नहीं पा रहा हूं कि अगर मैं एक डेटाबेस पर संग्रहीत प्रक्रिया लिखता हूं जो एक अलग डेटाबेस (उसी सर्वर पर) तालिका को अद्यतन करता है तो कोई डीटीसी आवश्यक नहीं है। तो क्यों ईएफ या लेनदेनस्कोप इसे डीटीसी को बढ़ावा दे रहा है? क्या इसके लिए कोई और काम है?

बताएं पहले से

धन्यवाद

साई

उत्तर

4
सादा DbConnection रों साथ

, आप एक ही कनेक्शन स्ट्रिंग (उपयोग कर किसी भी डेटाबेस के साथ द्वारा एक ही सर्वर पर एकाधिक डेटाबेस के लिए डीटीसी वृद्धि को रोका जा सकता आप जैसे) और खोले गए कनेक्शन ऑब्जेक्ट पर डेटाबेस को मैन्युअल रूप से बदलें:

using (var tx = new TransactionScope()) 
{ 
    using (var conn = new SqlConnection(connectStr)) 
    { 
     conn.Open(); 
     new SqlCommand("INSERT INTO atest VALUES (1)", conn).ExecuteNonQuery(); 
    } 
    using (var conn = new SqlConnection(connectStr)) 
    { 
     conn.Open(); 
     conn.ChangeDatabase("OtherDB"); 
     new SqlCommand("INSERT INTO btest VALUES (2)", conn).ExecuteNonQuery(); 
    } 
    tx.Complete(); 
} 

डीटीसी में नहीं बढ़ेगा, लेकिन अगर आप connectStr के लिए अलग-अलग मानों का इस्तेमाल करेंगे।

मैं ईएफ से परिचित नहीं हूं और यह कनेक्शन और संदर्भों का प्रबंधन कैसे करता है, लेकिन उपर्युक्त अंतर्दृष्टि का उपयोग करके, आप conn.ChangeDatabase(..) करके डीटीसी वृद्धि से बचने में सक्षम हो सकते हैं और फिर अपना संदर्भ new DbContext(conn, ...) बना सकते हैं।

लेकिन कृपया ध्यान दें कि यहां तक ​​कि एक साझा कनेक्ट तार के साथ, जैसे ही आप दो कनेक्शन एक ही समय में खुला है के रूप में, डीटीसी शामिल हो जाएगा, इस तरह संशोधित उदाहरण में:

using (var tx = new TransactionScope()) 
{ 
    using (var conn = new SqlConnection(mssqldb)) 
    { 
     conn.Open(); 
     new SqlCommand("INSERT INTO atest VALUES (1)", conn).ExecuteNonQuery(); 
     using (var conn2 = new SqlConnection(mssqldb)) 
     { 
      conn2.Open(); 
      conn2.ChangeDatabase("otherdatabase"); 
      new SqlCommand("INSERT INTO btest VALUES (2)", conn2).ExecuteNonQuery(); 
     } 
    } 
    tx.Complete(); 
} 
+0

मैं प्रतिबद्ध करने के लिए चाहते हैं एक लेनदेन के दायरे के तहत एक ही सर्वर पर दो पूरी तरह से अलग डीबीएस पर लेनदेन। मैं संग्रहीत प्रक्रियाओं के माध्यम से ऐसा कर सकता हूं लेकिन ईएफ के माध्यम से नहीं। यद्यपि आपके उत्तर के लिए धन्यवाद। – Sai

+0

मेरा उत्तर दिखाता है कि संग्रहीत प्रोसेस का उपयोग किए बिना ऐसा करने के लिए 'ट्रांज़ेक्शनस्कोप' का उपयोग कैसे करें। अंतर्निहित 'tx.Dispose()' जो 'tx.Complete()' लाइन के बाद होता है, वह एकल लेनदेन करेगा जो INSERT दोनों को दो अलग-अलग डेटाबेस में शामिल करता है। जैसा कि बताया गया है, ईएफ के साथ कनेक्शन प्रदान करने के तरीके हैं जहां आपने मैन्युअल रूप से 'चेंजडेटाबेस()' कहा है, लेकिन आपके कोड बेस के आधार पर, जिसके परिणामस्वरूप अधिक कठोर युग्मित कोड हो सकता है (जबकि 'ट्रांज़ेक्शनस्कोप' बिंदु को डीक्यूपल करना है) केवल आप ही बता सकते हैं। –

+0

मुझे नहीं लगता कि मैं चेंजडेटाबेस() का उपयोग कर सकता हूं क्योंकि मैं डेटाबेसफर्स्ट दृष्टिकोण का उपयोग कर रहा हूं और मेरा डीबीकोनटेक्स्ट कसकर इकाइयों से जुड़ा हुआ है। अगर मैं रनटाइम पर कनेक्शनस्टिंग को पूरी तरह से अलग डेटाबेस में बदलता हूं, तो यह त्रुटि फेंक देगा। – Sai