मैं उन परिचालनों को लिखना चाहता हूं जो असफल हो सकते हैं, लेकिन वापस रोल करने का एक तरीका है।कंपोजेबल परमाणु-जैसे ऑपरेशंस
उदाहरण के लिए - एक होटल के कमरे को बुक करने के लिए एक बाहरी कॉल, और क्रेडिट कार्ड चार्ज करने के लिए एक बाहरी कॉल। उन दोनों कॉल विफल हो सकती हैं जैसे कोई कमरा नहीं छोड़ा गया, अमान्य क्रेडिट कार्ड। दोनों के पास वापस रोल करने के तरीके हैं - होटल के कमरे को रद्द करें, क्रेडिट शुल्क रद्द करें।
- क्या इस प्रकार के (वास्तविक नहीं) परमाणु के लिए कोई नाम है। जब भी मैं हैकेल लेनदेन की खोज करता हूं, मुझे
STM
मिलता है। - क्या कोई अमूर्तता है, उन्हें लिखने का एक तरीका है, या हैकेल या किसी अन्य भाषा में लाइब्रेरी है?
मुझे लगता है कि आप एक मोनड Atomic T
लिख सकते हैं जो इन परिचालनों को ट्रैक करेगा और अपवाद होने पर उन्हें वापस रोल करेगा।
संपादित करें:
ये अभियान IO
संचालन हो सकता है। यदि ऑपरेशन केवल स्मृति संचालन थे, क्योंकि दोनों उत्तरों सुझाव देते हैं, एसटीएम पर्याप्त होगा।
उदाहरण के लिए बुकिंग होटल HTTP अनुरोधों के माध्यम से होगा। सॉकेट संचार के माध्यम से रिकॉर्ड डालने जैसे डाटाबेस ऑपरेशंस।
वास्तविक दुनिया में, अपरिवर्तनीय संचालन के लिए ऑपरेशन करने से पहले एक अनुग्रह अवधि होती है - उदा। क्रेडिट कार्ड भुगतान और होटल बुकिंग दिन के अंत में तय की जा सकती है, और इसलिए पहले रद्द करना ठीक है।
आह, लेकिन एसटीएम विशेष रूप से आईओ को प्रतिबंधित करता है। यह प्रश्न आईओ कार्यों के बारे में पूछता है जिसे दूसरी आईओ कार्रवाई के साथ आवश्यक होने पर उलट किया जा सकता है। –
एसटीएम आईओ कार्यों के साथ बहुत संगत है - यह सिर्फ उन्हें सीधे नहीं करता है (http://book.realworldhaskell.org/read/software-transactional-memory.html)। सभी आईओ * लेनदेन नहीं हो सकते हैं - 'लॉन्च मिस्त्री' – amindfv
के लिए कोई 'रोलबैक' कार्रवाई नहीं है, मुझे नहीं लगता कि प्रश्न विशेष रूप से 'आईओ' का उल्लेख करता है। लेकिन किसी भी मामले में, 'आईओ' का उत्तर यह है कि यह नहीं किया जा सकता है, क्योंकि 'आईओ' मोनैड में ऐसे ऑपरेशन हैं जो सूचना को अपरिवर्तनीय रूप से नष्ट कर देते हैं, और राज्य को डुप्लिकेट करने का कोई तरीका नहीं है। वास्तव में, 'आईओ' मोनैड विशेष रूप से इसके लिए डिज़ाइन किया गया है! –