2011-09-06 10 views
25

बहुत आसान सवाल: System.Transactions.TransactionScope का उपयोग SqlBulkCopy के साथ करना संभव है? प्रलेखन Transaction and Bulk Copy Operations कुछ भी उल्लेख नहीं करता है (कम से कम .NET 4.0 के रूप में) और मेरा परीक्षण इंगित करता है कि यह TransactionScope के साथ स्वचालित रूप से सूचीबद्ध नहीं होता है।क्या सिस्टम का उपयोग करना संभव है। लेनदेन। SqlBulkCopy के साथ ट्रांसक्रिप्शनस्कोप?

+0

यहाँ में ताला समय कम करने के लिए इस्तेमाल किया जा सकता TransactionScope कि अपनी स्थिति http://stackoverflow.com/q/2884863/463478 के लिए उपयोगी हो सकता है के बारे में कुछ जवाब है –

उत्तर

3

थोक लोड (मेरे ज्ञान के लिए) में लेनदेन को परिभाषित करने का एकमात्र तरीका बैचसाइज निर्दिष्ट करना है।

थोक भार का लाभ यह है कि आपको थोक अपडेट लॉक (बहु-थ्रेडेड रीड और बहु-थ्रेडेड राइट) मिलता है। बीसीपी, थोक डालने, एक एसएसआईएस डेटा फ्लो टास्क (टैब्लोक) का उपयोग करते समय आपको यह मिलता है, एक डालने (कॉलम) ओपनरोसेट (थोक), या एक एसक्लबुलकॉपी से कॉलम का चयन करें। लोड करने और लेनदेन लॉग आकार दोनों को कम करने की कोशिश करते समय यह आसान है (केवल तभी जब आप न्यूनतम लॉग इन आवश्यकताओं को संतुष्ट करते हैं, जो आपको लाखों पंक्तियों पर घंटे बचाएगा)।

जब भी आप डेटा लोड करते हैं, लेनदेन लॉग बाधा बनने जा रहा है। यदि समय सार का है, तो यह कम करना महत्वपूर्ण है कि लॉग इन कितना हो जाता है।

बैचसाइज संतुष्ट होने के बाद (पंक्तियों की संख्या जिसे आपने निर्दिष्ट करने के लिए निर्दिष्ट किया है) लेनदेन प्रतिबद्ध हो जाता है और शुरू होता है। यदि आप 0 का बैचसाइज निर्दिष्ट करते हैं, तो लेनदेन पूरी फ़ाइल और रोलबैक को कवर करेगा यदि कोई डेटा समस्या उत्पन्न होती है।

+0

यह दुर्भाग्यपूर्ण है। मेरे पास सिंगल-पंक्ति काम करता है और थोक लोड * एकाधिक * तालिकाओं में होता है जिसके बाद एक अन्य तालिका में सिंगल-पंक्ति अपडेट होता है जिसे सभी सफल होते हैं या कोई भी सफल नहीं होता है। मैं उम्मीद कर रहा था कि एक 'लेनदेनस्कोप' में काम और थोक भार और अंतिम अद्यतन लपेटना आसान होगा। मुझे बस एक अलग दृष्टिकोण लेना होगा। विस्तृत उत्तर के लिए धन्यवाद, बहुत सराहना की। – jason

4

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

  1. गंतव्य डेटाबेस सर्वर पर एक SQL कनेक्शन बनाएँ।
  2. कनेक्शन खोलें।
  3. एक एसक्लट्रांसेंस ऑब्जेक्ट बनाएं।
  4. SqlBulkCopy ऑब्जेक्ट को SqlTransaction ऑब्जेक्ट में कन्स्ट्रक्टर में पास करना बनाएँ।
  5. आयात करें - WriteToServer पर कॉल - के भीतर प्रयास करें ... ब्लॉक को पकड़ें। यदि ऑपरेशन पूरा हो जाता है, लेनदेन प्रतिबद्ध करें; अगर यह विफल रहता है, तो इसे वापस रोल करें।

Using Transactions with SqlBulkCopy

+0

हमारे पास दो डेटाबेस शामिल हैं? –

+1

यह उत्तर लेनदेनस्कोप की व्याख्या नहीं करता है जिसे पूछा गया था। – usr

24

SqlBulkCopy कभी नहीं एक सौदे में सूचीबद्ध। SqlCommand भी ऐसा नहीं करता है। सामान्य गलतफहमी। SqlConnection.Open पर नामांकन किया जाता है। उसके बाद, उस कनेक्शन पर चलने वाली कोई भी चीज़ लेनदेन का हिस्सा है। वास्तव में यह एक स्पष्ट लेनदेन पारित करने के लिए की अनुमति नहीं है।

आप SqlBulkCopyTransactionScope लेनदेन बार जब आप कनेक्शन खोलने पर सेट किया जाना चाहिए का उपयोग कर एक System.Transactions.Transaction में भाग लेना चाहते हैं।

यह क्या करने के लिए बहुत आसान है:

using (var tran = new TransactionScope(...)) 
using (var conn = new SqlConnection(connStr)) 
{ 
    conn.Open(); //This enlists. 

    using (var sqlBulkCopy = new SqlBulkCopy(conn)) { 
    sqlBulkCopy.WriteToServer(...); 
    } 

    tran.Complete(); //Commit. 
} 

इस कोड को आप सभी की जरूरत है। संभावित गलतियों:

  1. लेनदेन पर्याप्त जल्दी खोला जाना चाहिए।
  2. SqlBulkCopy के SqlTransaction पैरामीटर का उपयोग न करें। null पास करें।
  3. SqlBulkCopyOptions.UseInternalTransaction का उपयोग न करें।
  4. अपवाद हैंडलिंग न जोड़ें जबतक कि आप वास्तव में कुछ नहीं करना चाहते हैं। यदि कोई प्रतिबद्धता नहीं है तो रोलबैक स्वचालित है।
  5. स्वच्छ कोड और निर्धारक सफाई के लिए using कथन का उपयोग करें। इन वस्तुओं में से किसी भी मैन्युअल रूप से बंद या निपटान न करें जब तक आपको करना न पड़े। यह अनावश्यक होगा।

आप अपने पसंदीदा बैच आकार का उपयोग कर सकते हैं और सभी बैच लेनदेन का हिस्सा होंगे। इसलिए, बैचिंग सीमित मूल्य है (विशेष रूप से लेनदेन लॉग को जल्दी से छोटा नहीं किया जा सकता है)। पहले बैचिंग का प्रयास न करें।

-1

अतिरिक्त तरीका वास्तविक जीवन


use SqlBulkCopy and copy data to temporary table use delete output construction to move data into production table

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