2009-10-25 9 views
5

मैं इस शाम को अपने ज्ञान पर ब्रश कर रहा हूं, जिस कंपनी के लिए मैं काम कर रहा था, उसके कारण 4 साल के खराब प्रोग्रामिंग प्रथाओं को दूर करने की कोशिश कर रहा था। हाल ही में जो चीजें मैंने ठोकर खाई हैं उनमें से एक सिस्टम था। लेनदेन। पिछले कुछ घंटों के लिए उनके बारे में पढ़ने के बाद, मुझे लगता है कि मेरे पास पर्याप्त काम है कि वे कैसे काम करते हैं और आप उनका उपयोग क्यों करना चाहते हैं। हालांकि, मैंने जिन सभी उदाहरणों को देखा है, वे इनलाइन टी-एसक्यूएल को लेनदेन के भीतर से बुला रहे हैं।मिक्सिंग सिस्टम। एसक्यूएलट्रैक्शन के साथ लेनदेन

मैं बहुत ज्यादा उपयोग संग्रहित प्रक्रिया विशेष रूप से जब डेटाबेस का उपयोग कर रहे हैं और मौजूदा संग्रहित प्रक्रियाओं सब अपने स्वयं के SqlTransactions में लिपटे रहे हैं। आप 'शुरुआती ट्रैन' का उपयोग करके और फिर वापस रोलिंग या काम करते हुए जानते हैं। यदि एक संग्रहित प्रो एक और संग्रहित प्रो कॉल करता है, तो यह भी एक लेनदेन बनाता है और जब तक कोई बाहरी या तो वापस नहीं आता है तब तक कमेटी बबल बन जाता है। बहुत अच्छा काम करता है।

तो अब मेरा सवाल है, अगर मैं सिस्टम का उपयोग शुरू करना चाहता हूं। मेरे कोड में लेनदेन - लगातार डेटाबेस कार्यों की निगरानी के सरल उद्देश्यों के लिए जिन्हें एक ही संग्रहित प्रक्रिया के अंदर घोंसला नहीं जा सकता - यह कैसे काम करता है मौजूदा एसक्यूएलट्रैक्शन मैं पहले से ही अपने संग्रहित प्रोसेस में है?

सिस्टम का उपयोग करेगा। मेरे कोड में लेन-देन केवल वास्तव में प्रतिबद्ध होने से पहले सुरक्षा की एक और परत जोड़ें, या क्योंकि मैं स्पष्ट रूप से अपने एसक्यूएलट्रांसक्शन में काम कर रहा हूं - डेटा को आधारित या वापस कोडिंग के आधार पर डेटा जारी रखा जाएगा लेन-देन?

+0

इस प्रश्न पर स्वीकृत उत्तर गलत है। सिस्टम के भीतर एक एसक्यूएल लेनदेन का उपयोग करना। लेनदेन अनपेक्षित व्यवहार का कारण बनता है (यानी, एक एसक्यूएल लेनदेन बाहरी सिस्टम पर भाग नहीं लेता है। लेनदेन!) ऐसा करने से आपके लेनदेन को प्रभावी ढंग से बेअसर कर दिया जाता है। –

+0

इन सुधारों को करने के लिए निम्नलिखित के लिए धन्यवाद, बिल। 7 साल बाद और मुझे यह भी याद नहीं है कि क्या मैंने कुछ भी लागू करने के लिए इसे समाप्त कर दिया है, लेकिन सही जवाब चिह्नित करना अच्छा है। :) – WesleyJohnson

उत्तर

4

नहीं है, System.Transactions और Sql लेनदेन मिश्रण नहीं है।

और मैं उद्धृत करता हूं, निम्नलिखित एमएसडीएन आलेख से "उन्हें मिक्स न करें" आलेख: https://msdn.microsoft.com/en-us/library/ms973865.aspx

एसक्यूएल लेनदेन बाहरी सिस्टम पर भाग नहीं लेते हैं। जिस तरह से आप उन्हें चाहते हैं। एसक्यूएल लेनदेन जो विफल या रोलबैक सिस्टम के भीतर अन्य गतिविधियों का कारण नहीं बनेंगे। रोलबैक के लिए लेनदेन।


यह उदाहरण घटना से पता चलता:

using (var tx = new TransactionScope()) 
{ 
    using (var con = new SqlConnection($"{connectionstring}")) 
    { 
     con.Open(); 

     using (var com = new SqlCommand($"set xact_abort on; begin transaction; INSERT INTO dbo.KeyValueTable VALUES ('value1', '{Guid.NewGuid()}'); rollback;", con)) 
     { 
      // This transaction failed, but it doesn't rollback the entire system.transaction! 
      com.ExecuteNonQuery(); 
     } 

     using (var com = new SqlCommand($"set xact_abort on; begin transaction; INSERT INTO dbo.KeyValueTable VALUES ('value2', '{Guid.NewGuid()}'); commit;", con)) 
     { 
      // This transaction will actually persist! 
      com.ExecuteNonQuery(); 
     } 
    } 
    tx.Complete(); 
} 

एक खाली डेटा स्टोर पर इस उदाहरण चल दिखाई पड़ेगा कि दूसरे Sql आपरेशन से रिकॉर्ड वास्तव में प्रतिबद्ध हैं, के बाद जब सी # की संरचना कोड इंगित करेगा कि वे नहीं होना चाहिए।


बस रखें, आपको उन्हें मिश्रण नहीं करना चाहिए। यदि आप किसी एप्लिकेशन के भीतर एकाधिक एसक्यूएल लेनदेन को ऑर्केस्ट्रेट कर रहे हैं तो आपको केवल सिस्टम का उपयोग करना चाहिए। लेनदेन। दुर्भाग्य से इसका मतलब है कि आप अपने सभी संग्रहित प्रक्रियाओं से अपने लेनदेन कोड को हटा रहे हैं, लेकिन हां, यह एक मिश्रित मॉडल के साथ जरूरी है कि आप अपने डेटा की अखंडता की गारंटी नहीं दे सकते।

+0

धन्यवाद, मैंने स्वीकृत उत्तर बदल दिया है। – WesleyJohnson

+0

क्या होगा यदि एक स्पष्ट ADO.Net लेनदेन का उपयोग SQLLommand के लिए किया गया था और वह लेनदेन XA लेनदेन में शामिल किया गया था (या यह भी संभव है)? क्या वह एक्सए लेनदेन रद्द कर देगा? – STLDeveloper

-1

ठीक काम करता है, यदि संग्रहीत प्रोसेस के भीतर आपके आंतरिक लेनदेन किए गए हैं तो सबकुछ प्रतिबद्ध होगा। यदि उनमें से एक वापस रोल करता है तो बाहरी ट्रांसकेशन के भीतर सब कुछ वापस रोल जाएगा। शुद्ध जादू। :)

+0

उत्कृष्ट। यही वह था जिसे मैं उम्मीद कर रहा था और यह तार्किक उत्तर की तरह लग रहा था, मैं बस यह नहीं मानना ​​चाहता था। बहुत सराहना की। – WesleyJohnson

+0

यह निश्चित रूप से गलत है। देखें: https://msdn.microsoft.com/en-us/library/ms973865.aspx –

+0

स्वीकृत उत्तर बदल दिया गया है। :) – WesleyJohnson

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