【发布时间】:2013-02-13 11:19:51
【问题描述】:
这与question 相关,但非常具体地说明了 Pascal 在his answer 中指出的问题。
如果实体不存在(它的主键不在数据库中),我需要将其持久化,否则我需要重试新实体的生成并将其持久化。
我们基本上有一个使用过的记录表,我在其中生成随机数,但我不能有重复(而且我不能使用 UUID 或类似的东西)。所以我们在一张表中跟踪使用过的,以数字作为主键。
如何使用 JPA 确保仅在它存在时才创建它,从而避免竞争条件?我需要避免这样的情况:线程一个查询是否存在,然后线程两个查询,然后线程一个插入,然后线程两个插入 - 重复。
显而易见的选择是尝试捕获异常。问题是事务在 EntityExistsException 上回滚,但我想回滚并保留下一个随机数,而不是回滚事务。
丑陋的解决方案似乎是在单独的事务中调用新实体的持久化(所以让它回滚)。这里有更好的做法吗?
如果能明确知道原因是重复,这样当潜在问题是其他问题时,进程就不会继续重试。
【问题讨论】:
标签: jpa ejb jpa-2.0 jboss7.x ejb-3.1