2010-05-05 66 views
3

因此,我對CQS的基本概念感到滿意,在這裏您可能有寫入一個數據庫的命令,並且會更新您讀取的查詢數據庫。命令查詢分隔驗證重試

但是,請考慮輸入數據並希望防止重複的場景。

使用新僱員的數據輸入僱員寄存器作爲一個例子,通過一堆申請表格工作在新僱員的細節,以鍵:

  1. 以頂片。
  2. 在UI中輸入員工姓名和唯一薪資編號。
  3. 提交。
  4. 將紙張放入「完成的紙堆」中。
  5. 重複。

您現在將如何防止用戶再次鍵入相同的工資覈算編號,比如說,如果他們分心並且不記得他們是否已經鍵入了一個,並且「消息」沒有一路回到查詢數據庫供用戶搜索?

回答

1

首先,您可以輕鬆使用本地緩存來確保直接用戶不會再次使用相同的數字。這很簡單。

但實際上這並不能阻止一個事實,即錯誤地認爲兩個人可以同時使用相同的關鍵數據。正如別人提到的,雖然這是CQRS之外的。這幾乎可以發生在任何架構中。

現在CQRS可以改變的主要是我們如何應對衝突。我看到兩種可能的解決方案:

  1. 系統發送命令關閉,然後等待成功的結果。如果這是一個失敗,你只需要詢問固定信息,然後重試。從我聽到的一切來看,這似乎是錯誤的,甚至可能是一種反模式,儘管我沒有足夠的專家來說任何方式。

  2. 系統關閉命令並最終通知用戶衝突。他們可以去解決問題。在你的情況下輸入一個新號碼(可能會再次發生衝突)。

0

我建議的工作流程改變這種

  1. 檢查頂片採取或不在數據庫中(你應該有一個表R鍵記得具體的行是否採取與否),如果採取那麼如果不是,則返回假 ,然後取頂部工作表。並將採取的行的標誌設置爲在表格中被採取。R
  2. 輸入員工姓名和唯一工資號給UI。
  3. 提交。
  4. 將紙張放入「完成的紙堆」中。
  5. 重複。

該步驟應該是原子執行的。

+0

但是,這正是我描述的過程 - 問題在於你的第1步 - 如何在消息更新查詢之前檢查你如何知道你不是剛剛提交了頂層表單D b? – 2010-05-06 08:40:42

+0

因爲您可以限制檢索。當用戶檢索到最上面的條目時,您將其標記爲「已取得」,這意味着只有一位客戶獲得了該條目。 – zsong 2010-05-06 16:14:47

0

您能否跟蹤客戶端上已輸入的員工/工資總額組合列表?如果這是一個Web客戶端,可能是一個cookie,如果是胖客戶端,那麼內存或其他。當他們第一次進入系統時,清除列表並重新開始。

1

數據輸入是一個非協作的域 - 您沒有多個用戶對相同的共享數據集執行操作。因此,CQRS並不特別相關。

+0

我的問題不在於多個用戶,而是關於同一個用戶提交兩次相同的事情。我不能依靠查詢數據庫來阻止他們這樣做,因爲數據可能不在數據庫中。 – 2010-06-17 10:13:17

+0

我在說的是,你不應該使用單向命令(一個CQRS) - 完全同步到數據庫。把事情簡單化 :) – 2010-06-18 07:24:44