चूँकि आप यह नहीं निर्दिष्ट करते हैं कि "लिखना" डेटाबेस का उद्देश्य क्या होगा, मैं यहाँ यह मानूँगा कि आपका क्या मतलब है: जब आप किसी नए अद्यतन को रजिस्टर करते हैं, तो इवेंट स्टोर से कुल के पुनर्निर्माण के बजाय, आप इसे "राइट" डेटाबेस से उठाएं, परिवर्तन को मान्य करें, और एक ईवेंट जारी करें।
यदि आपका यही मतलब है, तो यह रणनीति असंगतता के लिए एक स्थिति पैदा करेगी: यदि कोई नया अपडेट होता है, तो इससे पहले कि आखिरी बार इसे "राइट" डेटाबेस में बनाने का मौका मिले, नया अपडेट पुराने डेटा के विरुद्ध मान्य हो जाएगा, इस प्रकार संभावित रूप से एक "असंभव" (यानी "अस्वीकृत") ईवेंट जारी करना और सिस्टम स्थिति को दूषित करना।
उदाहरण के लिए, एक थिएटर में सीटों की बुकिंग के एक स्थायी उदाहरण पर विचार करें। दोहरी बुकिंग को रोकने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि जिस सीट को बुक किया जा रहा है वह पहले से ही नहीं है - इसे आप "सत्यापन" कहते हैं। ऐसा करने के लिए, आप "राइट" डेटाबेस में पहले से बुक की गई सीटों की एक सूची संग्रहीत करते हैं। फिर, जब कोई बुकिंग अनुरोध आता है, तो आप जांच लें कि अनुरोधित सीट सूची में है या नहीं, और "बुक" घटना जारी करें, अन्यथा त्रुटि संदेश के साथ जवाब दें। फिर आप एक प्रक्षेपण प्रक्रिया चलाते हैं, जहां आप "बुक" घटनाओं को सुनते हैं और बुक की गई सीटों को "राइट" डेटाबेस में सूची में जोड़ते हैं।
आम तौर पर, सिस्टम इस तरह काम करेगा:
1. Request to book seat #1
2. Check in the "already booked" list: the list is empty.
3. Issue a "booked seat #1" event.
4. Projection process catches the event, adds seat #1 to the "already booked" list.
5. Another request to book seat #1.
6. Check in the list: the list contains seat #1
7. Respond with an error message.
हालाँकि, क्या होगा यदि अनुरोध बहुत जल्दी आते हैं, और चरण 4 से पहले चरण 5 होता है?
1. Request to book seat #1
2. Check in the "already booked" list: the list is empty.
3. Issue a "booked seat #1" event.
4. Another request to book seat #1.
5. Check in the list: the list is still empty.
6. Issue another "booked seat #1" event.
अब आपके पास एक ही सीट बुक करने के लिए दो इवेंट हैं। सिस्टम स्थिति दूषित है।
ऐसा होने से रोकने के लिए, आपको किसी प्रक्षेपण के विरुद्ध अद्यतनों को मान्य नहीं करना चाहिए। किसी अद्यतन को मान्य करने के लिए, आप इवेंट स्टोर से कुल का पुनर्निर्माण करते हैं, फिर इसके विरुद्ध अद्यतन को मान्य करते हैं। उसके बाद, आप एक ईवेंट जारी करते हैं, लेकिन यह सुनिश्चित करने के लिए टाइमस्टैम्प गार्ड का उपयोग करते हैं कि स्टोर से अंतिम बार पढ़ने के बाद कोई नई ईवेंट जारी नहीं की गई है। यदि यह विफल रहता है, तो आप अभी पुनः प्रयास करें।
ईवेंट की दुकान से एकत्रित पुनर्निर्माण प्रदर्शन जुर्माना ले सकता है। इसे कम करने के लिए, आप ईवेंट स्ट्रीम में सही स्नैपशॉट संग्रहीत कर सकते हैं, उस इवेंट की आईडी के साथ टैग किया गया है जिसमें स्नैपशॉट बनाया गया था। इस तरह, आप सबसे हाल के स्नैपशॉट को लोड करके और उसके बाद आने वाली घटनाओं को फिर से जोड़कर, समय की शुरुआत से पूरे इवेंट स्ट्रीम को हमेशा के लिए फिर से बनाने के विपरीत एकत्र कर सकते हैं।