【问题标题】:@Transactional not working when i throw exception on next line当我在下一行抛出异常时@Transactional 不起作用
【发布时间】:2020-04-02 16:03:32
【问题描述】:

我不明白以下行为:

我有一个方法:

@Transactional
public void processRejection(final Path path) {

    try {

        //some code here

    } catch (final Exception e) {
         this.handleException(e));
    }
 }

它调用下面的 saves 一个在数据库中尚不存在的实体:

void handleException(final Throwable e) {

    this.filesMonitoringJpaManager.save(someEntityHere);

    throw new Exception(...)
}

现在奇怪的是,当我评论 throw new Exception(...) save 有效,但是当我取消评论 throw new Exception(...) 然后save 无效我不知道为什么?

JPA 或 Hibernate 有什么奇怪的行为?是不是关于Java Exception机制的东西我不明白?

【问题讨论】:

    标签: java spring database hibernate spring-boot


    【解决方案1】:

    @Transactional 用于在出现问题时回滚(抛出异常)。您在 catch 块中保存了一个实体,但您正在重新抛出一个异常,导致事务方法回滚。

    但你可以指定一个不会导致回滚的异常:

    @Transactional(noRollbackFor = {MyException.class})
    public void processRejection(final Path path) {
    
        try {
            //somecode here whatever
        } catch (final Exception e) {
             this.handleException(e));
        }
     }
    
    void handleException(final Throwable e) {
        this.filesMonitoringJpaManager.save(someEntityHere);
        throw new MyException(...)
    }
    

    这适用于org.springframework.transaction.annotation.Transactional。如果你使用javax.transaction.Transactional,那么你可以通过dontRollbackOn属性来实现。

    【讨论】:

    • @GOXR3PLUS 我正在回滚您的更改。 noRollbackFor 代表org.springframework.transaction.annotation.Transactional
    • 明白了 :) 非常感谢。
    • 如果 MyException 是业务逻辑异常,您应该只使用检查异常。对于已检查的异常,默认没有回滚。
    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 2023-03-13
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多