Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试重试事务方法失败,约束冲突_Java_Spring_Hibernate_Jpa_Transactions - Fatal编程技术网

Java 尝试重试事务方法失败,约束冲突

Java 尝试重试事务方法失败,约束冲突,java,spring,hibernate,jpa,transactions,Java,Spring,Hibernate,Jpa,Transactions,我正在尝试创建唯一的随机令牌并将其保存到数据库中。由于有多个服务器同时执行此操作,因此所采取的方法是尝试保存随机生成的令牌,但创建一个新令牌,如果无效,请重试 我们发现重试功能不起作用。事务似乎没有回滚。事务是注释驱动的,我们使用Hibernate作为JPA提供程序 我们的代码如下所示: @Autowired EntityManager em; Token save(Token t, int attempts) { if(attempts > SOME_MAX) { thro

我正在尝试创建唯一的随机令牌并将其保存到数据库中。由于有多个服务器同时执行此操作,因此所采取的方法是尝试保存随机生成的令牌,但创建一个新令牌,如果无效,请重试

我们发现重试功能不起作用。事务似乎没有回滚。事务是注释驱动的,我们使用Hibernate作为JPA提供程序

我们的代码如下所示:

@Autowired EntityManager em;

Token save(Token t, int attempts) {
  if(attempts > SOME_MAX) {
    throw new RuntimeException("Could not generate Token");
  }

  t.setId(MyRandomNumberGenerator.next());
  try {
    saveToDb(t);
  catch(PersistenceException e) {
      t = save(t.clone(), ++attempts);
  }
  return t;
}

@Transactional(propogation=Propagation.REQUIRES_NEW)
boolean saveToDb(Token t) {
    em.persist(t);
    em.flush();
}
调用save时,已经有一个事务在进行,我在saveToDb的catch块中尝试了各种方法,以尝试确保从当前上下文中删除原始的违规标记,但无论我尝试什么,每次调用saveToDb都会抛出一个约束冲突异常

其目的是,当saveToDb失败时,它创建的新事务将回滚,以便save方法可以重试


有没有办法让这种方法起作用,或者我应该放弃它,尝试其他方法?

我相信在异常之后,您需要新的EM,因为异常之后EM的状态未知

我相信,如果您直接从同一个类调用跨国方法,就有可能根本不考虑注释

在代理模式(这是默认模式)下,只截获通过代理传入的外部方法调用。这意味着自调用,实际上是目标对象内调用目标对象另一个方法的方法,即使调用的方法标记为@Transactional,在运行时也不会导致实际事务


看一看。

em是自动连接的,有弹性,所以这不是一个真正的选项。我将更新这个示例。在持久性中,将logging切换为fine并查看调用了哪些语句,我相信将再次尝试插入标记的“先前”尝试。可能尝试EM.remove after transaction error。对不起,我不是spring人,不知道它的事务语义。就是这样!将这两个方法放在不同的类中使其工作。非常感谢你!