2010-05-05 71 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