2009-06-02 9 views
5

मैं कोड का एक टुकड़ा है कि (ClearImportTable और InsertPage प्रक्रियाओं जमा हो जाती है) कुछ इस तरह दिखता है:संग्रहित प्रक्रियाओं का उपयोग करके LINQ से SQL में लेन-देन का उपयोग कैसे करूं?

datacontext.ClearImportTable() //Essentially a DELETE FROM table 
for (int i = 1; i < MAX_PAGES; ++i){ 
    datacontext.InsertPage(i); //Inserts data into the table 
} 

यह मेरा कोड की कुछ हद तक एक सरलीकृत संस्करण है, लेकिन यह विचार है कि यह डालने से पहले मेज साफ करता है रिकॉर्ड। एकमात्र समस्या यह है कि यदि ClearImportTable के बाद कोई त्रुटि उत्पन्न होती है, तो तालिका के सभी डेटा मिटा दिए जाते हैं। क्या लेन-देन में इसे लपेटने का कोई तरीका है ताकि अगर कोई गलती हो, तो सब कुछ वापस रखा जाएगा? एक अपवाद तब होता है या का उपयोग कर ब्लॉक transaction.Complete() तो सब कुछ ब्लॉक का उपयोग में की जाने वाली वापस लुढ़का हुआ है मार बिना छोड़ दिया जाता है, तो

using (var transaction = new TransactionScope()) 
{ 
    // do stuff here... 
    transaction.Complete(); 
} 

:

उत्तर

9

आप एक सौदे गुंजाइश कर सकते हैं।

आपको सिस्टम का संदर्भ देना होगा। लेनदेन असेंबली।

+0

इसके लिए एमएसडीटीसी का उपयोग करने की आवश्यकता है, जो हमेशा एक अच्छा विचार नहीं है। –

+0

मेरा मानना ​​है कि एमएसडीटीसी केवल तभी जरूरी है जब आप ट्रांसकेशन के भीतर एक से अधिक linq डेटाकेंटेक्स्ट बनाते हैं और उनके खिलाफ क्वेरी चलाते हैं। यदि आप लेन-देन के दायरे में केवल एक डाटाकेंटेक्स्ट ऑब्जेक्ट बनाते हैं तो इसकी आवश्यकता नहीं है। –

+1

एमएसडीटीसी केवल तभी जरूरी है जब एकाधिक संसाधन प्रबंधक शामिल हों। जब तक आप केवल एक डेटाकॉन्टेक्स्ट को शामिल करते हैं और एक एकल SQL सर्वर इंस्टेंस से कनेक्ट करते हैं, तो आपको हल्के लेनदेन का उपयोग करना चाहिए। – jrista

0

डेटाकॉन्टेक्स्ट पर लेनदेन संपत्ति सेट करें?

9

उपरोक्त वर्णित "सेलिंग जुडो" के रूप में, मैंने ट्रांसक्रिप्शनस्कोप ब्लॉक का उपयोग बड़ी सफलता के साथ किया है जब मुझे संग्रहीत प्रोसेस को कॉल करने की आवश्यकता है। हालांकि एक "गॉचा" है जिसे मैंने चलाया है जहां एक अपवाद फेंक दिया गया है कि "लेनदेन संदेह में है।" इसके आस-पास पहुंचने के लिए मुझे तुरंत परिणाम का मूल्यांकन करने के लिए proc पर एक nondeferred विधि कॉल करना पड़ा। तो

using (var transaction = new TransactionScope()) 
{ 
    var db = new dbDataContext(); 

    db.StoredProc(); 
    transaction.Complete(); 
} 

के बजाय मैं इसे इस तरह कॉल करने के लिए ...

using (var transaction = new TransactionScope()) 
{ 
    var db = new dbDataContext(); 

    db.StoredProc().ToList(); 
    transaction.Complete(); 
} 

इस उदाहरण में था, ToList() किसी भी nondeferred तरीका है जिसके कारण बनता है LINQ तुरंत परिणाम का मूल्यांकन करने के हो सकता है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि LINQs आलसी (स्थगित) प्रकृति लेनदेन के समय के साथ अच्छी तरह से खेल नहीं रही है, लेकिन यह केवल एक अनुमान है। यदि कोई इस पर अधिक प्रकाश डाल सकता है, तो मुझे इसके बारे में सुनना अच्छा लगेगा।

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