gpt4 book ai didi

java - 如何处理 spring jpa @transactional 和 catch block 中的新插入

转载 作者:行者123 更新时间:2023-12-01 09:53:48 26 4
gpt4 key购买 nike

我得到了这个代码。我正在使用 spring boot 和 jpa

@Transactional

public class MyClass {

public void createSomething() {
try {
saveAndFlush();
} catch (Exception e) {
// Since error has occured I want to insert this information
// into a audit table

repository.saveAndFlush();

}
}

}

现在,当异常发生时,事务将回滚,因此不会发生错误表插入。

我看到了

HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in XXXXX entry (don't flush the Session after an exception occurs)

为了解决这个问题,我尝试将错误插入到标有 @Transactional(propagation = Propagation.REQUIRES_NEW) 的新方法中。基于内部事务将完成且外部事务将回滚的理解

但我没有看到我想要的输出。

最佳答案

从类级别删除@Transactional,并将其用于实际执行事务的方法。 (当然,如果该类中有超过 1 个方法)。

如果您希望独立事务提交/回滚到数据库,请在不会干扰全局事务的方法上使用 REQUIRES_NEW 传播。

未提及任何传播的“@Transactional”的默认行为是,如果有可用的全局(调用)事务,则加入全局(调用)事务,如果没有,则启动新事务。

由于您有全局事务,因此它会完全回滚。相反,您需要独立的事务。

关于java - 如何处理 spring jpa @transactional 和 catch block 中的新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37395224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com