Karena Anda tidak menentukan apa yang akan menjadi tujuan dari database "tulis", saya akan berasumsi di sini bahwa yang Anda maksudkan adalah ini: ketika mendaftarkan pembaruan baru ke agregat, alih-alih membangun kembali agregat dari toko kejadian, Anda angkat dari database "tulis", validasi perubahan, dan keluarkan suatu peristiwa.
Jika ini yang Anda maksud, maka strategi ini akan menciptakan kondisi ketidakkonsistenan: jika pembaruan baru terjadi sebelum yang terakhir memiliki kesempatan untuk membuatnya menjadi database "tulis", pembaruan baru akan berakhir divalidasi terhadap data yang sudah usang, dengan demikian berpotensi mengeluarkan peristiwa "tidak mungkin" (yaitu "tidak diizinkan") dan merusak kondisi sistem.
Misalnya, perhatikan contoh berdiri pemesanan kursi di teater. Untuk mencegah pemesanan ganda, Anda perlu memastikan bahwa kursi yang dipesan belum diambil - inilah yang Anda sebut "validasi". Untuk melakukan itu, Anda menyimpan daftar kursi yang sudah dipesan di database "tulis". Kemudian, ketika permintaan pemesanan masuk, Anda memeriksa apakah kursi yang diminta ada dalam daftar, dan jika tidak, berikan acara "dipesan", jika tidak balas dengan pesan kesalahan. Kemudian Anda menjalankan proses proyeksi, di mana Anda mendengarkan acara "dipesan" dan menambahkan kursi dipesan ke daftar di database "tulis".
Biasanya, sistem akan berfungsi seperti ini:
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.
Namun, bagaimana jika permintaan masuk terlalu cepat, dan langkah 5 terjadi sebelum langkah 4?
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.
Sekarang Anda memiliki dua acara untuk memesan kursi yang sama. Status sistem rusak.
Untuk mencegah hal ini terjadi, Anda tidak boleh memvalidasi pembaruan terhadap suatu proyeksi. Untuk memvalidasi pembaruan, Anda membangun kembali agregat dari toko acara, lalu memvalidasi pembaruan yang menentangnya. Setelah itu, Anda mengeluarkan acara, tetapi gunakan penjaga stempel waktu untuk memastikan bahwa tidak ada acara baru yang dikeluarkan sejak Anda terakhir membaca dari toko. Jika gagal, Anda hanya perlu mencoba lagi.
Membangun kembali agregat dari toko acara mungkin membawa penalti kinerja. Untuk mengurangi ini, Anda dapat menyimpan snapshot agregat tepat di aliran acara, ditandai dengan ID peristiwa dari mana snapshot dibuat. Dengan cara ini, Anda dapat membangun kembali agregat dengan memuat snapshot terbaru dan hanya mengulang peristiwa yang datang setelahnya, sebagai lawan untuk selalu memutar ulang seluruh aliran peristiwa dari awal waktu.