这与这个问题有关,但非常具体地谈到了帕斯卡在他的回答中指出的问题。
如果实体不存在(它的主键不在数据库中),我需要持久化它,否则我需要重试新实体的生成并持久化它。
我们基本上有一个使用过的记录表,我在其中生成随机数,但我不能有重复(而且我不能使用 UUID 或类似的东西)。所以我们在一个表中跟踪使用的那些,以数字作为主键。
如何使用 JPA 确保仅在它存在时才创建它,从而避免竞争条件?我需要避免这样的情况:线程一个查询是否存在,然后线程两个查询,然后线程一个插入,然后线程两个插入 - 重复。
显而易见的选择是尝试捕获异常。问题是事务在 EntityExistsException 上回滚,但我想回滚并保留下一个随机数,而不是回滚事务。
丑陋的解决方案似乎是在单独的事务中调用新实体的持久性(所以让它回滚)。这里有更好的做法吗?
明确地知道原因是重复也是很好的,这样当潜在问题是其他问题时,该过程就不会继续重试。