बहुत आसान सवाल: System.Transactions.TransactionScope
का उपयोग SqlBulkCopy
के साथ करना संभव है? प्रलेखन Transaction and Bulk Copy Operations कुछ भी उल्लेख नहीं करता है (कम से कम .NET 4.0 के रूप में) और मेरा परीक्षण इंगित करता है कि यह TransactionScope
के साथ स्वचालित रूप से सूचीबद्ध नहीं होता है।क्या सिस्टम का उपयोग करना संभव है। लेनदेन। SqlBulkCopy के साथ ट्रांसक्रिप्शनस्कोप?
उत्तर
थोक लोड (मेरे ज्ञान के लिए) में लेनदेन को परिभाषित करने का एकमात्र तरीका बैचसाइज निर्दिष्ट करना है।
थोक भार का लाभ यह है कि आपको थोक अपडेट लॉक (बहु-थ्रेडेड रीड और बहु-थ्रेडेड राइट) मिलता है। बीसीपी, थोक डालने, एक एसएसआईएस डेटा फ्लो टास्क (टैब्लोक) का उपयोग करते समय आपको यह मिलता है, एक डालने (कॉलम) ओपनरोसेट (थोक), या एक एसक्लबुलकॉपी से कॉलम का चयन करें। लोड करने और लेनदेन लॉग आकार दोनों को कम करने की कोशिश करते समय यह आसान है (केवल तभी जब आप न्यूनतम लॉग इन आवश्यकताओं को संतुष्ट करते हैं, जो आपको लाखों पंक्तियों पर घंटे बचाएगा)।
जब भी आप डेटा लोड करते हैं, लेनदेन लॉग बाधा बनने जा रहा है। यदि समय सार का है, तो यह कम करना महत्वपूर्ण है कि लॉग इन कितना हो जाता है।
बैचसाइज संतुष्ट होने के बाद (पंक्तियों की संख्या जिसे आपने निर्दिष्ट करने के लिए निर्दिष्ट किया है) लेनदेन प्रतिबद्ध हो जाता है और शुरू होता है। यदि आप 0 का बैचसाइज निर्दिष्ट करते हैं, तो लेनदेन पूरी फ़ाइल और रोलबैक को कवर करेगा यदि कोई डेटा समस्या उत्पन्न होती है।
यह दुर्भाग्यपूर्ण है। मेरे पास सिंगल-पंक्ति काम करता है और थोक लोड * एकाधिक * तालिकाओं में होता है जिसके बाद एक अन्य तालिका में सिंगल-पंक्ति अपडेट होता है जिसे सभी सफल होते हैं या कोई भी सफल नहीं होता है। मैं उम्मीद कर रहा था कि एक 'लेनदेनस्कोप' में काम और थोक भार और अंतिम अद्यतन लपेटना आसान होगा। मुझे बस एक अलग दृष्टिकोण लेना होगा। विस्तृत उत्तर के लिए धन्यवाद, बहुत सराहना की। – jason
परमाणु SqlBulkCopy आयात करने के लिए जो सभी बैचों (और वैकल्पिक रूप से, अन्य डेटाबेस विवरणों में) में फैलता है, हमें लेनदेन का उपयोग करने की आवश्यकता होती है। निम्नलिखित चरण एसक्यूएलकल्क कॉपी के साथ लेनदेन का उपयोग करने की प्रक्रिया को रेखांकित करते हैं:
- गंतव्य डेटाबेस सर्वर पर एक SQL कनेक्शन बनाएँ।
- कनेक्शन खोलें।
- एक एसक्लट्रांसेंस ऑब्जेक्ट बनाएं।
- SqlBulkCopy ऑब्जेक्ट को SqlTransaction ऑब्जेक्ट में कन्स्ट्रक्टर में पास करना बनाएँ।
- आयात करें - WriteToServer पर कॉल - के भीतर प्रयास करें ... ब्लॉक को पकड़ें। यदि ऑपरेशन पूरा हो जाता है, लेनदेन प्रतिबद्ध करें; अगर यह विफल रहता है, तो इसे वापस रोल करें।
हमारे पास दो डेटाबेस शामिल हैं? –
यह उत्तर लेनदेनस्कोप की व्याख्या नहीं करता है जिसे पूछा गया था। – usr
SqlBulkCopy
कभी नहीं एक सौदे में सूचीबद्ध। SqlCommand
भी ऐसा नहीं करता है। सामान्य गलतफहमी। SqlConnection.Open
पर नामांकन किया जाता है। उसके बाद, उस कनेक्शन पर चलने वाली कोई भी चीज़ लेनदेन का हिस्सा है। वास्तव में यह एक स्पष्ट लेनदेन पारित करने के लिए की अनुमति नहीं है।
आप SqlBulkCopy
TransactionScope
लेनदेन बार जब आप कनेक्शन खोलने पर सेट किया जाना चाहिए का उपयोग कर एक 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.
}
इस कोड को आप सभी की जरूरत है। संभावित गलतियों:
- लेनदेन पर्याप्त जल्दी खोला जाना चाहिए।
SqlBulkCopy
केSqlTransaction
पैरामीटर का उपयोग न करें।null
पास करें।SqlBulkCopyOptions.UseInternalTransaction
का उपयोग न करें।- अपवाद हैंडलिंग न जोड़ें जबतक कि आप वास्तव में कुछ नहीं करना चाहते हैं। यदि कोई प्रतिबद्धता नहीं है तो रोलबैक स्वचालित है।
- स्वच्छ कोड और निर्धारक सफाई के लिए
using
कथन का उपयोग करें। इन वस्तुओं में से किसी भी मैन्युअल रूप से बंद या निपटान न करें जब तक आपको करना न पड़े। यह अनावश्यक होगा।
आप अपने पसंदीदा बैच आकार का उपयोग कर सकते हैं और सभी बैच लेनदेन का हिस्सा होंगे। इसलिए, बैचिंग सीमित मूल्य है (विशेष रूप से लेनदेन लॉग को जल्दी से छोटा नहीं किया जा सकता है)। पहले बैचिंग का प्रयास न करें।
अतिरिक्त तरीका वास्तविक जीवन
use SqlBulkCopy and copy data to temporary table use delete output construction to move data into production table
- 1. सिस्टम का व्यावहारिक उपयोग क्या है। लेनदेन?
- 2. क्या क्यूटी के साथ सीन का उपयोग करना संभव है?
- 3. क्या सी के साथ ईजिन का उपयोग करना संभव है?
- 4. क्या माउस के साथ vim का उपयोग करना संभव है
- 5. क्या एसवीएन के साथ स्काईडाइव का उपयोग करना संभव है?
- 6. मिक्सिंग सिस्टम। एसक्यूएलट्रैक्शन के साथ लेनदेन
- 7. डी: DataContext के साथ XmlDataProvider का उपयोग करना संभव है?
- 8. क्या जैस्मीन के टूहेवबिनकॉलड का उपयोग नियमित अभिव्यक्ति के साथ मैचर के साथ करना संभव है?
- 9. क्या एएसपी.नेट एमवीसी के साथ लॉगऑन सिस्टम बनाना संभव है लेकिन सदस्यता प्रदाता का उपयोग नहीं करना है?
- 10. SqlBulkCopy
- 11. क्या symfony2 के साथ दोहरी प्रमाणीकरण का उपयोग करना संभव है?
- 12. क्या पाइथन दुभाषिया संस्करण ड्रीमपी का उपयोग करना संभव है?
- 13. SqlBulkCopy
- 14. सिस्टम का उपयोग करना। यादृच्छिक
- 15. क्या बूस्ट :: टेस्ट पर स्वचालित पंजीकरण के साथ BOOST_PARAM_TEST_CASE का उपयोग करना संभव है?
- 16. क्या MySQLBulkLoader लेनदेन के साथ उपयोग किया जा सकता है?
- 17. SqlBulkCopy
- 18. sqlbulkcopy
- 19. टाइमआउट का समय SqlBulkCopy
- 20. क्या Python से re2 का उपयोग करना संभव है?
- 21. SqlBulkCopy
- 22. क्या अभी तक कॉमनजेएस पुस्तकालयों का उपयोग करना संभव है?
- 23. स्तंभ नामों का सम्मान करने के लिए SqlBulkCopy प्राप्त करना
- 24. सबक्वायरी का पुन: उपयोग करना संभव है?
- 25. क्या Emacs में TRAMP के साथ रोपेमैक का उपयोग करना संभव है?
- 26. क्या Django और Node.Js का उपयोग करना संभव है?
- 27. क्या PHP में array_shift() का उपयोग करना संभव है और कुंजी प्राप्त करना संभव है?
- 28. क्या सी ++ स्मार्ट पॉइंटर्स का उपयोग सी के मॉलोक के साथ करना संभव है?
- 29. क्या पैरामीटर रहित कन्स्ट्रक्टर के बिना कक्षा के साथ प्रोटोबफ-नेट का उपयोग करना संभव है?
- 30. क्या बाहरी फ़ाइल के बिना एसवीजी के साथ वेबकिट सीएसएस मास्क का उपयोग करना संभव है?
यहाँ में ताला समय कम करने के लिए इस्तेमाल किया जा सकता TransactionScope कि अपनी स्थिति http://stackoverflow.com/q/2884863/463478 के लिए उपयोगी हो सकता है के बारे में कुछ जवाब है –