[英]Two threads writing different fields of same entity
我有以下情况。
一个业务实体(BE)由2个线程异步提供的2个部分组成。 示例:我们的BE具有字段id和A,B,C-全部在数据库的一个表中。 当实体存储到数据库中时,Id是按顺序生成的。 B是唯一字段,数据库中对此有约束。 Process1提供了字段A和B。Process2提供了字段B和C。因此,在两个过程完成之后,我们应该在表中的一行中填满所有列。
进行这项工作的好方法是什么?
现在做什么:
在每个过程中,我们首先从表中选择所有值,其中B列中的值就是现在的值。 (如果有的话-这意味着其他进程已经保存了它的一部分)。 如果有的话,它会随着缺少的列而丰富并持续存在。 如果什么都没有-我们只是坚持我们拥有的。 但是,尽管所有这些都完成了,但是有可能另一个进程完成了它的工作,并且当我们保留实体时,我们会得到ConstraintViolationException并将休眠事务标记为回滚。 并且缺少的列仍然丢失。
您首先必须决定如何处理冲突。 为此,请回答以下问题:
如果在进程2运行时进程1更改了您的实体,则2的结果仍然有效吗? 还是应该重新运行?
如果进程1更新了字段B,则进程2在运行时应该覆盖进程2吗? 还是只保留过程1的价值?
当然,问题也应该通过1和2互换来回答。
如果以某种方式实施流程,使他们采用原始实体,并产生一个新的修改过的实体并以其开始,那么您可以有一个队列,其中添加了所有这些结果,并且有一个流程将这些更改应用于数据库。
在特定情况下,可能有更简单的方法,但这是我在问题中描述的最一般情况下建议的方法。
我会这样
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.