जैसा कि अन्य लोगों ने उल्लेख किया है, TransactionScope
जाने का रास्ता है।
यदि आप SQL Server 2008 और .NET 3 का उपयोग कर रहे हैं।5, मैं व्यापार ऑब्जेक्ट को लेनदेन को नियंत्रित करने के लिए डिज़ाइन को संशोधित करता हूं और डेटा परत से कनेक्शन खोलने और बंद करने देता हूं।
कनेक्शन पूलिंग के साथ, आप वास्तव में भौतिक डेटाबेस कनेक्शन खोलने के ऊपरी हिस्से को नहीं ले पाएंगे और वास्तविक कनेक्शन करने पर आपके कनेक्शन केवल खुले रहेंगे। चूंकि (मैंने माना) आपके पास SQL Server 2008 with .NET 3.5 your transaction will not escalate to a distributed transaction है (जब तक आप एक ही समय में एकाधिक कनेक्शन नहीं खोलते) ताकि आप दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर सकें।
तो फिर तुम इस तरह अपने व्यापार वस्तु लिख सकते हैं:
using (TransactionScope transactionScope = new TransactionScope())
{
DataObject dataObject = new DataObject();
dataObject.UpdateQuantity(...);
ShippingManager shippingManager = new ShippingManager();
shippingManager.ShipOrder(...);
transactionScope.Complete()
}
यह सब व्यापार वस्तुओं के लिए चारों ओर कनेक्शन तार पारित करने के लिए होने टाल और लेन-देन के समन्वय के लिए आसान बनाता है।
अद्यतन
System.Transactions की सुंदरता है कि लेन-देन के सभी कनेक्शन है कि आप प्रयोग कर रहे हैं पर ध्यान दिए बिना आप के लिए प्रबंधित कर रहे हैं है। आप बस एक लेनदेन स्कोप घोषित करते हैं और उस लेनदेनस्कोप के भीतर सभी डेटाबेस पहुंच एक लेनदेन के साथ होती है (जब तक कि आप अन्यथा विभिन्न लेनदेनस्कोप सेटिंग्स के साथ अनुरोध नहीं करते)।
अतीत में (SQL सर्वर 2005 .NET 2.0), यदि आपने कनेक्शन खोला और बंद कर दिया और फिर एक और कनेक्शन खोला और बंद कर दिया (यहां तक कि एक ही कनेक्शन स्ट्रिंग के साथ) तो लेनदेन को लाइटवेट लेनदेन से वितरित किया गया लेन-देन। यह अवांछित था क्योंकि प्रदर्शन पीड़ित है (एमएसडीटीसी के लिए संचार प्रक्रिया से बाहर है और दो चरण प्रतिबद्ध प्रोटोकॉल) और एमएसडीटीसी कई उत्पादन वातावरण (फ़ायरवॉल और सुरक्षा) में कॉन्फ़िगर करने के लिए दर्द हो सकता है।
SQL सर्वर 2008 और .NET 3.5 के साथ उन्होंने एक ही लेनदेन के भीतर एक ही कनेक्शन स्ट्रिंग के साथ एकाधिक कनेक्शन खोलने और बंद करते समय इस पदोन्नति से बचने की क्षमता को जोड़ा है। Extending Lightweight Transactions in SqlClient को उन्होंने जो देखा वह वास्तव में अच्छी व्याख्या के लिए।
अद्यतन 2
Oracle 10g के साथ लेन-देन TransactionScope के साथ ठीक से कार्य करेंगे। और ऐसा लगता है कि ODP.NET supports Lightweight Transactions (जो अच्छा है)। दुर्भाग्य से, मुझे लगता है कि एक वितरित लेनदेन को बढ़ावा देना कनेक्शन के समापन और उद्घाटन के साथ होगा।
यदि आप एक वितरित लेनदेन से बचना चाहते हैं तो आप प्रत्येक विधि कॉल/बिजनेस ऑब्जेक्ट से कनेक्शन पास कर सकते हैं। यदि आप आसपास कनेक्शन को पास नहीं करना चाहते हैं, तो आप ConnectionScope class का उपयोग कर सकते हैं जो कनेक्शन को थ्रेड पर खुलता रहता है। इसका एक विकल्प एंटरप्राइज़ लाइब्रेरी 3.0 (और ऊपर) डेटा एक्सेस एप्लिकेशन ब्लॉक का उपयोग करना होगा। वितरित लेनदेन से बचने के लिए Data Access Block can detect that a transaction is in progress and use the same connection।
हालांकि ओपी के वर्तमान डिज़ाइन के साथ 'ट्रांज़ेक्शनस्कोप' * कक्षा का उपयोग करने के लिए कक्षा है, इसके परिणामस्वरूप एमएसडीटीसी अक्षम या लॉक हो जाने पर इसका परिणाम एक वितरित लेनदेन या संभवतः एक अपवाद होगा। यह * संभव * वांछित परिणाम नहीं है। – Aaronaught
@ एरोशॉट, एसक्यूएल सर्वर 2008 और .NET 3.5 लेनदेन के साथ एक वितरित लेनदेन (वर्तमान डिजाइन के लिए) को पदोन्नत नहीं किया जाएगा। –
@Tuzo: सच है, SQL सर्वर 2008 के साथ आप एकाधिक कनेक्शन समस्या को धोखा देने में सक्षम हैं ** IF ** सभी कनेक्शन एक ही डेटाबेस ** और ** एक ही समय में केवल एक ही खुला है। यह अभी भी एक सुंदर संदिग्ध अभ्यास है, खासकर जब वैकल्पिक डिजाइन को किसी भी तरह से बनाना/बनाए रखना आसान है। – Aaronaught