लेनदेन के 2 मुख्य प्रकार हैं; कनेक्शन लेनदेन और परिवेश लेनदेन। एक कनेक्शन लेन-देन (जैसे SqlTransaction) सीधे db कनेक्शन (जैसे SqlConnection) से बंधा होता है, जिसका अर्थ है कि आपको कनेक्शन को पास रखना होगा - कुछ मामलों में ठीक है, लेकिन "बनाने / उपयोग" की अनुमति नहीं देता है " उपयोग, और क्रॉस-डीबी कार्य की अनुमति नहीं देता है। एक उदाहरण (अंतरिक्ष के लिए स्वरूपित):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
बहुत गड़बड़ नहीं है, लेकिन हमारे कनेक्शन "कॉन" तक सीमित है। यदि हम अलग-अलग तरीकों से कॉल करना चाहते हैं, तो हमें अब "कॉन" पास करना होगा।
विकल्प एक परिवेश लेनदेन है; .NET 2.0 में नया, TransactionScope ऑब्जेक्ट (System.Transactions.dll) कई प्रकार के ऑपरेशनों का उपयोग करने की अनुमति देता है (उपयुक्त प्रदाता स्वचालित रूप से परिवेशी लेनदेन में सूचीबद्ध होंगे)। यह मौजूदा (गैर-लेन-देन) कोड में रेट्रो-फिट करने के लिए आसान बनाता है, और कई प्रदाताओं से बात करने के लिए (हालांकि यदि आप एक से अधिक से बात करते हैं तो डीटीसी शामिल हो जाएगा)।
उदाहरण के लिए:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
यहाँ ध्यान दें कि दो विधियाँ अपने स्वयं के कनेक्शन (ओपन / यूज़ / क्लोज़ / डिस्पोज़) को हैंडल कर सकती हैं, फिर भी वे चुपचाप परिवेश के लेन-देन का हिस्सा बन जाएंगे, हमारे बिना कुछ भी पास होने के लिए नहीं।
यदि आपकी कोड त्रुटियां, निपटान () को पूर्ण के बिना कहा जाएगा (), तो इसे वापस रोल किया जाएगा। अपेक्षित घोंसले के शिकार आदि का समर्थन किया जाता है, हालांकि आप एक आंतरिक लेनदेन को रोल-बैक नहीं कर सकते हैं, फिर भी बाहरी लेनदेन को पूरा करें: यदि कोई भी नाखुश है, तो लेनदेन रद्द कर दिया गया है।
TransactionScope का अन्य लाभ यह है कि यह केवल डेटाबेस से बंधा नहीं है; कोई भी लेनदेन-जागरूक प्रदाता इसका उपयोग कर सकता है। उदाहरण के लिए, WCF। या यहां तक कि कुछ TransactionScope- संगत ऑब्जेक्ट मॉडल भी हैं (यानी .NET क्लासेज रोलबैक क्षमता के साथ - शायद एक स्मृति चिन्ह की तुलना में आसान है, हालाँकि मैंने कभी इस दृष्टिकोण का उपयोग नहीं किया है)।
सब सब में, एक बहुत, बहुत उपयोगी वस्तु।
कुछ चेतावनी:
- SQL Server 2000 पर, एक TransactionScope तुरंत DTC पर जाएगा; यह SQL Server 2005 और इसके बाद के संस्करण में तय किया गया है, यह LTM (बहुत कम ओवरहेड) का उपयोग तब तक कर सकता है जब तक कि आप 2 स्रोतों आदि से बात नहीं करते हैं, जब यह डीटीसी को ऊपर उठाया जाता है।
- एक गड़बड़ है जिसका अर्थ है कि आपको अपने कनेक्शन स्ट्रिंग को ट्विक करने की आवश्यकता हो सकती है