2012-10-12 10 views
5

DbConnection.EnlistTransaction क्या करता है?DbConnection.EnlistTransaction क्या करता है?

+0

दस्तावेज़ों की जांच करें? http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.enlisttransaction.aspx – DaveHogan

+0

मैं यहां नहीं पूछूंगा क्योंकि मैं वहां जांचता हूं .. –

+0

दस्तावेज़ - ऊपर पोस्ट किए गए - इसे पूरी तरह से वर्णन करें अच्छी तरह से "टिप्पणियां" के तहत। – DaveHogan

उत्तर

1

DbConnection.EnlistTransaction अनुमति देता है:

  • एक System.Transactions.Transaction के लिए कनेक्शन में शामिल होने से। यह कुछ कमी है: कनेक्शन पहले से ही एक "स्थानीय" लेन-देन (System.Data.Common.DbTransaction) में भाग ले रहा है, तो
    • , यह एक अपवाद के साथ विफल हो सकता है (ठोस कनेक्शन कार्यान्वयन पर निर्भर करने लगता है: Firebird 2 ऐसे में कोई फेंक अपवाद करता है स्थिति, SqlConnection और अधिकतर अन्य लोग फेंकते हैं)।
    • यदि कनेक्शन पहले से ही System.Transactions.Transaction में शामिल हो गया था, और यह अन्य लेनदेन अभी भी सक्रिय है, तो यह अपवाद के साथ विफल हो जाएगा।
    • उसी लेनदेन में बार-बार जुड़ना समर्थित है, कम से कम SqlConnection, OleDbConnection और OdbcConnection
      यदि कनेक्शन में वर्तमान में उपयोग किए जाने वाले कुछ संसाधन हैं, तो खोले गए डेटा रीडर द्वारा उपयोग किए जाने पर यह असफल हो सकता है। (यह मामला उन कनेक्शनों के आंतरिक कार्यान्वयन में बहुत जल्दी चेक की तरह दिखता है, जो आपूर्ति किए गए लेनदेन को महसूस करने से पहले किया गया है।)
      अन्य DbConnection कार्यान्वयन भिन्न हो सकते हैं।
  • लेनदेन छोड़ना जिसमें कनेक्शन सूचीबद्ध किया गया था, बशर्ते कि लेनदेन और अधिक सक्रिय न हो। (अन्यथा, कनेक्शन का उपयोग करने का प्रयास अपवाद के साथ विफल हो सकता है, कम से कम OdbcConnection के साथ।) null इसके लिए लेनदेन के रूप में आपूर्ति करें।
    ध्यान दें कि कुछ कनेक्शन SqlCeConnection जैसे NullReferenceException, और SQLiteConnection (कम से कम v1.0.105) फेंकते हैं, जो ArgumentNullException फेंकता है।
    यदि आप किसी अन्य लेन-देन में शामिल किए बिना किसी अन्य परिचालन के लिए कनेक्शन का उपयोग करना चाहते हैं तो पूरा होने के बाद लेनदेन छोड़ना आवश्यक है। कुछ कनेक्शन लेनदेन को स्वतः छोड़ने लगते हैं, अन्य ऐसा नहीं लगता है।

DbConnection.EnlistTransaction आमतौर पर System.Transactions.Transaction.Current के साथ उपयोग किया जाता है। यदि TransactionScope के भीतर कनेक्शन अधिग्रहित (खोला गया) है तो इसका उपयोग करने की आवश्यकता नहीं है: ऐसे मामले में, कनेक्शन स्वचालित रूप से वर्तमान लेनदेन में स्वयं को सूचीबद्ध करता है (जब तक कि इसकी कनेक्शन स्ट्रिंग अन्यथा enlist=false के साथ निर्देशित न हो)।

3

यह आपको एकाधिक कनेक्शन के बीच लेनदेन को समन्वयित करने की अनुमति देता है। यदि आप लेनदेनस्कोप का उपयोग करते हैं तो एक कनेक्शन स्वचालित रूप से एक लेनदेन में शामिल हो जाएगा। अन्यथा आपको मौजूदा लेनदेन के साथ सूची बनाना है।

+0

स्वचालित enlisting केवल गारंटी है अगर कनेक्शन लेनदेन के दायरे में अधिग्रहण किया जाता है। यदि इसे बाहर अधिग्रहित किया जाता है, तो भीतर उपयोग किया जाता है, इसे सूचीबद्ध नहीं किया जाएगा। (कम से कम मैंने देखा है कि एक कनेक्शन के साथ जिसे पहले किसी अन्य लेन-देन के दायरे में अधिग्रहित किया गया था: इसे अगले (किसी स्कोप पूर्ण होने के बाद) के साथ उपयोग करने के लिए, इसे स्पष्ट रूप से सूचीबद्ध करना आवश्यक था।) –

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