2009-11-06 15 views
6

मैं एक वेब ऐप पर एक लंबे ऑपरेशन के लिए एक पूर्ववत बटन लागू कर रहा हूं। चूंकि पूर्ववत एक और अनुरोध में आ जाएगा, मुझे ऑपरेशन करना है।मैं एक लेनदेन को कैसे रोलबैक कर सकता हूं जो पहले से ही किया जा चुका है?

क्या "शायद रोलबैक" जैसे लेनदेन पर संकेत जारी करने का कोई तरीका है? तो लेनदेन करने के बाद, यदि आवश्यक हो तो मैं अभी भी अन्य प्रक्रियाओं में रोलबैक कर सकता हूं।

अन्यथा पूर्ववत फ़ंक्शन उतना जटिल होगा जितना ऑपरेशन पूर्ववत हो रहा है।

क्या यह संभव है? अन्य विचारों का स्वागत है!

+0

क्या आपके द्वारा किए गए जानकारी पर डेटा निर्भरताएं होंगी? –

+0

केवल विदेशी कुंजी और बाल डेटा के साथ। उन्हें भी निश्चित रूप से हटा दिया जाना चाहिए। लेकिन ऑपरेशन परमाणु है और रोलबैक सुरक्षित रूप से सही काम करेगा। –

उत्तर

4

इस मामले में विचार प्रत्येक ऑपरेशन के लिए लॉग इन करना है - एक विशेष ऑपरेशन जो विपरीत लॉग करता है, विशेष लॉग में और जब आपको रोलबैक की आवश्यकता होती है तो आप वास्तव में उन आदेशों को चलाते हैं जिन्हें आपने लॉग किया है।

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

Oracle Flashback

मुझे नहीं लगता कि एसक्यूएल सर्वर पर एक समान तकनीक का है करते हैं और जरूरत एक एसओ जवाब है जो कहता है कि यह नहीं है, लेकिन एसक्यूएल विकसित रहता है ...

+0

यदि घटना बहुत पहले नहीं हुई थी, तो आप लॉग पीआई या एपेक्स एसक्यूएल से उपकरण का उपयोग कर सकते हैं (लुमेनेंट ने एक अच्छा बना दिया लेकिन 2005 में लॉग प्रारूप में बदलाव के बाद इसे उत्पादन करना बंद कर दिया)। इसके बारे में अच्छी चर्चा, जिसमें इसे मूल रूप से करने के बारे में लेखों के कई लिंक शामिल हैं (एक अच्छा बैकअप मानना): http://www.developersdex.com/sql/message.asp?p=580&r=6497847 क्वेस्ट लाइटस्पेड का अच्छा बैकअप है निरीक्षण सुविधा भी आपको यह देखने की अनुमति देती है कि बैकअप के समय डेटा कैसा दिखता था। –

+0

एपेक्सएसक्यूएल लॉग: http://www.apexsql.com/sql_tools_log.asp ... लॉग पीआई अब मौजूद नहीं है ... क्वेस्ट लाइटस्पीड: http://www.quest.com/litespeed-for-sql-server/ –

6

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

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

उम्मीद है कि इससे मदद मिलती है।

1

मुझे यकीन नहीं है कि आप यहां किस तकनीक का उपयोग कर रहे हैं, लेकिन इसके बारे में निश्चित रूप से बेहतर तरीके हैं। आप सत्र में डेटा संग्रहीत करके और अंतिम पृष्ठ पर होने पर काम करके शुरू कर सकते हैं। इन दिनों कई ढांचे में लंबे समय तक चलने वाले लेन-देन की अनुमति भी होती है जो कई अनुरोधों का विस्तार करती है।

हालांकि, आप संभवतः प्रत्येक पृष्ठ के अंत में प्रतिबद्ध होना चाहते हैं और प्रक्रिया पूरी होने पर बस कुछ प्रकार के ध्वज सेट करना चाहते हैं। इस तरह यदि इसके बीच में कुछ गलत हो जाता है तो उपयोगकर्ता ठीक हो सकता है और सब खो नहीं जाता है।

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

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