2013-01-22 20 views
3

我知道命令不應該失敗,所以我需要在發送之前驗證我的命令。在NEventStore中工作在同一個聚合根上的兩個用戶

但是,如果兩個用戶正在更新相同的聚合根並且兩個看起來都是有效的,那麼我們就會遇到併發問題。

如何在NEventStore中處理這個問題?我的客戶是否需要獲取保存事件時傳遞的版本號或提交ID,如果它已更改,那麼我引發異常?

回答

4

正如你所提到的,管理事物的一種方式是指定當你合計(有一個超載)時你期望採取行動的版本。

的承諾,然後階段將[通過域]產生ConcurrencyException如果產生的事件與衝突的: -

  • 已經存在[你沒有加載到您的累計。
  • 通過競爭過程同時寫入

確保你做> 1所讀取的NuGet包提出到項目.doc文件 - 它涵蓋的JO EventStore如何處理這種處理的基本原則。

更新清晰 NB雖然這一切工作,並有時是必要的,一般你會發現[和作爲默認的應該是努力工作,在快樂的地方到哪]您可以管理大多數解決衝突通過使你的命令在自然界中自然具有冪等性和/或在你的系統中使用自然衝突解決機制作爲一個整體,以便不需要依靠你的Event Store來提供這樣一個低級別的守護(例如etags,在事件中重試命令衝突等)。如果您發現自己在實踐中走上了任何重要的學位課程,我建議您在DDD-CQRS列表中使用足夠的實際用例來討論您的策略。

+0

我目前正在維護代碼,當聚合加載時,我看到_store.OpenStream(aggregateId,0,int.MaxVersion),我們的系統中沒有快照。不清楚這是做什麼。 –

+1

@JD。 'int.MaxVersion'位意味着'加載任何你能找到的東西,我們將從那裏開始工作'。如果您的編輯是基於特定版本的,那麼顯然這會讓您在編輯過程開始時有效的事件之後繼續檢索並播放事件。如果您輸入正確的版本號來限制事情,那麼數據庫PK將完成剩下的工作。 –

+0

客戶端如何知道要傳入_store.OpenStream()的版本?我必須堅持這個地方 - 即。在我讀的模型? –

相關問題