DDD के साथ लेन-देन की स्थिरता सुनिश्चित करना


9

मैं डीडीडी के साथ शुरुआत कर रहा हूं और समझता हूं कि कुल मिलाकर जड़ों का उपयोग ट्रांसनैशनल स्थिरता सुनिश्चित करने के लिए किया जाता है। हमें एक अनुप्रयोग सेवा में कई समुच्चय को संशोधित नहीं करना चाहिए।

मैं यह जानना चाहूंगा कि निम्नलिखित स्थिति से कैसे निपटा जाए।

मेरे पास उत्पाद नामक एक मूल जड़ है।

समूह नामक एक मूल जड़ भी है।

दोनों में आईडी है, और इसे स्वतंत्र रूप से संपादित किया जा सकता है।

एकाधिक उत्पाद एक ही समूह को इंगित कर सकते हैं।

मेरे पास एक एप्लिकेशन सेवा है जो किसी उत्पाद के समूह को बदल सकती है:

ProductService.ChangeProductGroup(string productId, string groupId)

  1. चेक समूह मौजूद है
  2. रिपॉजिटरी से उत्पाद प्राप्त करें
  3. इसका समूह निर्धारित करें
  4. उत्पाद को रिपॉजिटरी में वापस लिखें

मेरे पास एक एप्लिकेशन सेवा भी है जहां समूह को हटाया जा सकता है:

GroupService.DeleteGroup(string groupId) 1. उन रिपॉजिटरी से उत्पाद प्राप्त करें जिनके ग्रुपआईडी को ग्रुपआईडी के लिए सेट किया गया है, यह सुनिश्चित करें कि गिनती 0 या गर्भपात है। ग्रुप रिपॉजिटरी से ग्रुप हटाएं 3. परिवर्तन सहेजें

मेरा प्रश्न निम्नलिखित परिदृश्य है, अगर क्या होगा:

ProductService.ChangeProductGroup में, हम जाँचते हैं कि समूह मौजूद है (यह करता है), इसके ठीक बाद एक अलग उपयोगकर्ता चेकग्रुप को हटाता है (अन्य GroupService.DeleteGroup के माध्यम से)। इस मामले में हम एक उत्पाद के लिए एक संदर्भ सेट करते हैं जिसे अभी हटा दिया गया है?

क्या मेरे डिजाइन में यह दोष है कि मुझे एक अलग डोमेन डिजाइन का उपयोग करना चाहिए (यदि आवश्यक हो तो अतिरिक्त तत्व जोड़ना), या क्या मुझे लेनदेन का उपयोग करना होगा?

जवाबों:


2

हमारे पास एक ही मुद्दा है।

और मैंने इस समस्या को हल करने का कोई तरीका नहीं देखा, लेकिन सबसे खराब स्थिति में एक अपवाद प्राप्त करने के लिए लेन-देन के साथ या डीबी पर संगतता जांच के साथ।

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

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

हम Entity Framework का उपयोग करते हैं और EF6 डिफ़ॉल्ट रूप से read_commited_snapshot का उपयोग करता है, इसलिए रिपॉजिटरी से लगातार दो बार पढ़ने से हमें असंगत डेटा मिल सकता है। हम बस भविष्य के लिए ध्यान में रखते हैं जब व्यावसायिक प्रक्रियाओं को अधिक स्पष्ट रूप से उल्लिखित किया जाएगा और हम उल्लंघन किए गए निर्णय ले सकते हैं। और हाँ हम अभी भी मॉडल स्तर पर निरंतरता की जाँच करते हैं जैसा कि आप करते हैं। यह कम से कम डीएल से अलग बीएल का परीक्षण करने की अनुमति देता है।

मैं आपको सुझाव देता हूं कि यदि आपके पास 'लंबी' व्यापारिक लेन-देन है तो आप भंडार के बारे में सोच सकते हैं। यह काफी मुश्किल है क्योंकि यह निकला है।


1

मुझे लगता है कि यह एक डोमेन-चालित डिज़ाइन विशिष्ट प्रश्न नहीं है, बल्कि एक संसाधन प्रबंधन है।

संसाधनों को केवल लॉक किया जाना चाहिए क्योंकि वे अधिग्रहित हैं

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


नहीं, ताला लगाना "चाहिए" नहीं है। वास्तव में यह लंबे समय तक चलने वाले लेनदेन के साथ एक बहुत ही भयानक बात है। आप आशावादी संग़ठन का उपयोग करने से बेहतर हैं, जो हर आधुनिक ORM बॉक्स से बाहर का समर्थन करता है। और आशावादी सहमति के बारे में महान बात यह है कि यह गैर-ट्रांजेक्शनल डेटाबेस के साथ भी काम करता है, जब तक कि वे परमाणु अपडेट का समर्थन करते हैं।
आरोनोन

1
मैं लंबे समय से चल रहे लेन-देन के अंदर लॉकिंग की कमियों पर सहमत हूं, लेकिन @ g18c द्वारा वर्णित परिदृश्य काफी विपरीत के लिए संकेत करता है, अर्थात्, व्यक्तिगत समुच्चय पर संक्षिप्त संचालन।
रुक्मझु ३०'१४

0

आप समूह इकाई में उत्पाद आईडी स्टोर क्यों नहीं करते? इस तरह आप केवल एक एकल के साथ काम कर रहे हैं जो चीजों को आसान बना देगा।

इसके बाद आपको कुछ प्रकार के संगामिति पैटर्न लागू करने की आवश्यकता होगी जैसे यदि आप आशावादी संगोष्ठी चुनते हैं तो बस समूह इकाई में एक संस्करण गुण जोड़ें और यदि अद्यतन करते समय संस्करण मेल नहीं खाते हैं तो एक अपवाद फेंकें

समूह में उत्पाद जोड़ें

  1. जाँच करें कि क्या उत्पाद मौजूद है
  2. रिपॉजिटरी से समूह प्राप्त करें (इसके संस्करण आईडी संपत्ति सहित)
  3. Group.Add (productId)
  4. रिपॉजिटरी का उपयोग करके समूह को सहेजें (नए संस्करण आईडी के साथ अद्यतन करें और सुनिश्चित करें कि संस्करण को बदलने के लिए एक खंड जोड़ें।)

ORM के बहुत से संस्करण आईडी या टाइमस्टैम्प का उपयोग करके निर्मित आशावादी संगामिति है, लेकिन इसे स्वयं रोल करना आसान है। यहाँ कैसे Nhibernate http://ayende.com/blog/3946/nhibernate-mapping-concurrency में किया गया है पर एक अच्छा पोस्ट है ।


0

हालाँकि लेन-देन में मदद मिल सकती है, एक और तरीका है, खासकर यदि आपका परिदृश्य केवल कुछ मामलों तक सीमित है।

आप उन जांचों में जांचों को शामिल कर सकते हैं जो उत्परिवर्तन करते हैं, प्रत्येक चेक-और-म्यूट जोड़ी को एक परमाणु संचालन को प्रभावी ढंग से बनाते हैं।

उत्पाद-अद्यतन क्वेरी इनर (नव संदर्भित) समूह में मिलती है। यह उस समूह के चले जाने पर कुछ भी अपडेट करने का कारण बनता है।

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

क्वेरी मिलान की गई या अपडेट की गई पंक्तियों की संख्या लौटाती हैं। यदि परिणाम 0 है, तो आपने एक दौड़ की स्थिति खो दी और कुछ भी नहीं किया। यह एक अपवाद को फेंक सकता है, और एप्लिकेशन परत को संभाल सकता है, हालांकि यह चाहता है, जैसे कि शुरू से फिर से प्रयास करके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.