2011-09-04 12 views
10

मेरे पास एक डेटा फ़ाइल है और समय-समय पर मुझे फ़ाइल में बदलाव लिखना होगा। परिवर्तन में एक से अधिक स्थानों में बदलती जानकारी शामिल है। उदाहरण के लिए, फ़ाइल के अंत के पास कुछ डेटा बदलना और शुरुआत के करीब कुछ जानकारी भी बदलना। मैं चाहता हूं कि दोनों अलग-अलग दोनों सफल हों या दोनों विफल हो जाएं, अन्यथा यह अनिश्चित स्थिति में छोड़ दिया गया है और प्रभावी रूप से दूषित हो गया है। क्या इस परिदृश्य के लिए .NET या सामान्य रूप से कोई अंतर्निहित समर्थन है?सी # और विंडोज में लेनदेन फ़ाइल लेखन?

यदि नहीं तो दूसरों को इस मुद्दे को कैसे हल किया जाए? विंडोज़ पर एक डेटाबेस इस मुद्दे को कैसे हल करता है?

अद्यतन: मैं क्योंकि यह इतना XP के रूप में Windows के पुराने संस्करण पर उपलब्ध नहीं है ट्रांसेक्शनल NTFS क्षमता का उपयोग नहीं करना चाहते हैं और यह फ़ाइल अधिलेखित परिदृश्य में धीमी गति से जैसा कि ऊपर वर्णित है।

+1

इस लिंक को चेक करें: http://stackoverflow.com/questions/3267595/how-do-i-open-a-transacted-file-in-c – fatty

+0

आप किस फाइल सिस्टम पर चल रहे हैं? – Oded

+0

ट्रांजेक्शनल एनटीएफएस को देखते हुए यह बताता है कि फ़ाइल में ओवरराइट्स का प्रदर्शन बहुत धीमा है। यह मेरा सटीक परिदृश्य है और इसलिए यह एक दृष्टिकोण के रूप में बहुत धीमा दिखता है। डेटाबेस एक ही स्थिति को TxNTFS के उपयोग के बिना कैसे प्रबंधित करता है? –

उत्तर

4

यदि आप विंडोज 6 या बाद में (Vista/7/2008/2008R2) का उपयोग कर रहे हैं तो एनटीएफएस फाइल सिस्टम लेनदेन का समर्थन करता है (एक वितरित लेनदेन के भीतर): लेकिन आपको Win32 API को कॉल करने के लिए पी/Invoke का उपयोग करने की आवश्यकता होगी (इसे देखें question)।

यदि आपको विंडोज़ के पुराने संस्करणों, या गैर-एनटीएफएस विभाजनों पर चलने की आवश्यकता है तो आपको लेनदेन करने की आवश्यकता होगी। यह निश्चित रूप से गैर-तुच्छ है: प्रक्रिया और सिस्टम में एकाधिक प्रक्रियाओं (शेयरों के माध्यम से रिमोट एक्सेस सहित) को संभालने के दौरान पूर्ण एसीआईडी ​​कार्यक्षमता प्राप्त करना, इस धारणा के साथ भी क्रैश हो जाता है कि केवल आपके एक्सेस विधियों का उपयोग किया जाएगा (सामान्य Win32 API का उपयोग करने वाली कुछ अन्य प्रक्रिया निश्चित रूप से होगी सामान तोड़ना)।

इस मामले में एक डेटाबेस लगभग निश्चित रूप से आसान होगा: कई इन-प्रोसेस डेटाबेस (एसक्यूएल कॉम्पैक्ट संस्करण, एसक्यूएल लाइट, ...) हैं इसलिए डेटाबेस को सर्वर प्रक्रिया की आवश्यकता नहीं होती है।

+0

यह ध्यान देने योग्य है कि माइक्रोसॉफ्ट भविष्य में विंडोज संस्करणों में [टीएक्सएफ को हटा रहा है] (http://stackoverflow.com/q/13420643/69809) पर विचार कर रहा है। – Groo

3

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

आपके मामले में, यह आपकी फ़ाइल, जहां आप एक डेटा लिखने के लिए जा रहे हैं की एक प्रति हो सकता है, और अगर सब कुछ सफलता, विकल्प मूल फ़ाइल के साथ समाप्त इसकी प्रतिलिपि के साथ।

प्रतिस्थापन है: old जैसी मूल फ़ाइल का नाम बदलें, original जैसी बैकअप फ़ाइल का नाम बदलें।

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

यह तकनीक हमने वीएस आईडीई पर पिछली परियोजनाओं पर उपयोग की है जैसे औद्योगिक नियंत्रण के लिए सिस्टम बहुत अच्छी सफलता के साथ।

+0

बहुत अच्छा, आप शायद इस जवाब को थोड़ा और अधिक करना चाहते हैं। उदाहरण के लिए, क्या देखने के लिए कोई विशेष बात है? – Pacerier

+0

मुझे एक संबंधित लेख मिला: https://dutherenverseauborddelatable.wordpress.com/2014/02/05/is-my-data-on-the-disk-safety-properties-of-os-file-writeatomic/ – Pacerier

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