3

因此,我对 CQS 的基本概念感到满意,您可能有一个写入一个数据库的命令,并更新您从中读取的查询数据库。

但是,请考虑您正在输入数据并希望防止重复的情况。

以新员工数据录入员工登记为例,通过一堆申请表输入新员工的详细信息:

  1. 拿上表。
  2. 在 UI 中键入员工姓名和唯一工资单编号。
  3. 提交。
  4. 将纸张放入“完成的堆”中。
  5. 重复。

您现在如何防止用户再次输入相同的工资单号码,例如,如果他们分心并且不记得他们是否已经输入了一个并且“消息”还没有回到用户搜索的查询数据库?

4

4 回答 4

1

数据输入是一个非协作域 - 您没有多个用户对同一共享数据集执行操作。因此,CQRS 并不是特别相关。

于 2010-05-07T06:10:08.597 回答
1

首先,您可以轻松地使用本地缓存来确保直接用户不会再次重复使用相同的号码。这很容易。

但这并不能阻止两个人错误地同时使用相同的关键数据的事实。正如其他人提到的那样,这在 CQRS 之外。这可能发生在几乎任何架构中。

现在,CQRS 可以改变的主要事情是我们如何应对冲突。我看到两种可能的解决方案:

  1. 系统发送命令关闭,然后等待成功的结果。如果失败,您只需要求提供固定信息并重试。从我所听到的一切来看,这似乎是错误的,甚至可能是一种反模式,尽管我还没有足够的专家来说任何一种方式。

  2. 系统发送命令,最终通知用户冲突。他们可以去某个地方解决问题。在您的情况下,通过输入一个新号码(这可能会再次发生冲突)。

于 2010-05-10T16:59:20.490 回答
0

我建议将工作流程更改为此

  1. 检查数据库中的顶页是否被占用(你应该有一个表 R 来记住特定行是否被占用),如果被占用则返回 false,如果没有,则获取顶页。并在表 R 中将所采用行的标志设置为“采用”
  2. 在 UI 中键入员工姓名和唯一工资单编号。
  3. 提交。
  4. 将纸张放入“完成的堆”中。
  5. 重复。

该步骤应该以原子方式执行。

于 2010-05-05T16:47:28.663 回答
0

您能否跟踪客户端上已输入的员工/工资单号码组合列表?如果这是一个 Web 客户端,则可能是 cookie,如果是胖客户端,则可能是内存或其他。当他们第一次进入系统时,清除列表并重新开始。

于 2010-05-07T01:40:17.530 回答