写同一实体的不同领域的两个线程

时间:2012-10-24 10:05:04

标签: java hibernate

我有以下情况。

一个业务实体(BE)由2个线程异步提供的2个部分组成。 示例:我们的BE具有字段ID和A,B,C - 所有这些都在数据库中的一个表中。当实体存储到数据库中时,Id由序列生成。 B是唯一的字段,在数据库中有它的约束。 Process1提供字段A和B. Process2提供字段B和C.因此,在两个进程完成后,我们应该在一个表中有一行,所有列都填入。

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

现在做了什么:

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

2 个答案:

答案 0 :(得分:0)

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

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

如果进程1更新字段B应该在进程2运行时进程2是否应该覆盖它?或者只保留过程1的值?

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

如果您以采用原始实体的方式实现流程,并生成新的已修改+原始实体,则可以使用单个队列添加所有这些结果,并应用这些更改的单个流程到您的数据库。

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

答案 1 :(得分:-1)

我会这样做

  • 在启动线程之前加载或创建实体
  • 启动主题并将其分配给每个
  • 在两个主题中更新它
  • 当两者都完成保存到db