2

我有以下情况。

一个业务实体 (BE) 由 2 个线程异步提供的 2 个部分组成。示例:我们的 BE 具有字段 id 和 A、B、C - 都在数据库的一个表中。id 是实体存入数据库时​​按顺序生成的。B 是唯一字段,在数据库中有限制。Process1 提供字段 A 和 B。Process2 提供字段 B 和 C。因此,在两个过程完成后,我们应该在表格中有一行,所有列都已填写。

使这项工作的好方法是什么?

现在做了什么:

在每个过程中,我们首先从表中选择所有值,其中 B 列中的值是我们现在拥有的值。(如果有的话 - 这意味着其他进程已经保存了它的一部分)。如果有什么东西,它会用缺失的列丰富并持久化。如果什么都没有 - 我们只是坚持我们所拥有的。但是当所有这些都完成时,可能会发生另一个进程完成它的工作,当我们持久化我们的实体时,我们会得到 ConstraintViolationException 和休眠标记事务回滚。并且丢失的列仍然丢失。

4

2 回答 2

0

您首先必须决定如何处理冲突。对于这个答案,以下问题:

如果在进程 2 运行时进程 1 更改了您的实体,那么 2 的结果是否仍然有效?还是应该重新运行?

如果进程 1 更新字段 B 应该在进程 2 运行时应该进程 2 覆盖它吗?还是只保留流程1的价值?

当然问题也应该用1和2互换来回答。

如果您以他们采用原始实体的方式实现该过程,并生成一个新的修改+他们开始使用的原始实体,您可以有一个添加所有这些结果的队列和一个将这些更改应用到您的数据库的单个进程.

在特定情况下,更简单的方法可能是可能的,但这是我在您在问题中描述的非常一般情况下推荐的方法。

于 2012-10-26T12:33:03.527 回答
-1

我会这样做

  • 在启动线程之前加载或创建实体
  • 启动线程并将其分配给每个
  • 在两个线程中更新它
  • 当两者都完成保存到数据库时
于 2012-10-26T11:48:19.557 回答