【问题标题】:Spring : Caught EmptyResultDataAccessException causing entire transaction to rollbackSpring:捕获 EmptyResultDataAccessException 导致整个事务回滚
【发布时间】:2017-07-31 21:29:26
【问题描述】:

我有两种方法如下所示。

@Transactional
public void methodA(){
    logger.trace("Executing methodA");
    methodB()
    logger.trace("Executing methodA completed");
}

public void methodB(){
    //other codes here
    try{
        staffDao.queryById(1)   //Fetch a record from database
    }catch(EmptyResultDataAccessException e){
        logger.trace("Staff does not exists")
    }
    //other codes here
}

methodB() 中出现EmptyResultDataAccessException 时 ,在methodA() 开始的整个事务被回滚,由以下异常

org.springframework.transaction.UnexpectedRollbackException: 事务回滚,因为它已被标记为仅回滚

我知道这是 spring @Transactional 注解的默认行为。

就我而言,即使有EmptyResultDataAccessException,我也需要提交事务。由于EmptyResultDataAccessExceptionRuntimeException,我不能使用@Transactional 注释的noRollBackFor 属性。

谁能提出解决方案?

【问题讨论】:

  • 一个快速的解决方案是让 EmptyResultDataAccessException 成为检查异常,因为 spring 在检查异常的情况下不会回滚。

标签: java spring transactions spring-jdbc spring-transactions


【解决方案1】:

我还没有仔细查看您的代码,但如果您只是需要一种方法来不回滚特定异常的事务,您可以在@Transactional 注释中标记它。

@Transactional(noRollbackFor = {EmptyResultDataAccessException.class})
public void methodA(){
.
.
}

http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#noRollbackFor--

【讨论】:

    【解决方案2】:

    看SimpleJpaRepository中deleteById的代码

    public void deleteById(ID id) {
        Assert.notNull(id, "The given id must not be null!");
        this.delete(this.findById(id).orElseThrow(() -> {
            return new EmptyResultDataAccessException(String.format("No %s entity with id %s exists!", this.entityInformation.getJavaType(), id), 1);
        }));
    }
    

    我认为这只是一种方便的方法。如果我不想要异常,我只是按照我需要的方式实现它:

    repo.findById(id).ifPresent(repo::delete);
    

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2015-03-02
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 2016-11-28
      相关资源
      最近更新 更多