Java 尝试重试事务方法失败,约束冲突
我正在尝试创建唯一的随机令牌并将其保存到数据库中。由于有多个服务器同时执行此操作,因此所采取的方法是尝试保存随机生成的令牌,但创建一个新令牌,如果无效,请重试 我们发现重试功能不起作用。事务似乎没有回滚。事务是注释驱动的,我们使用Hibernate作为JPA提供程序 我们的代码如下所示: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
@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人,不知道它的事务语义。就是这样!将这两个方法放在不同的类中使其工作。非常感谢你!