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