Java Spring:捕获到EmptyResultDataAccessException,导致整个事务回滚

Java Spring:捕获到EmptyResultDataAccessException,导致整个事务回滚,java,spring,transactions,spring-jdbc,spring-transactions,Java,Spring,Transactions,Spring Jdbc,Spring Transactions,我有两种方法,如下所示 @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

我有两种方法,如下所示

@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
注释的默认行为

@Transactional(noRollbackFor = {EmptyResultDataAccessException.class})
public void methodA(){
.
.
}
对于我的情况,即使存在
EmptyResultDataAccessException
,我也需要提交事务。由于
EmptyResultDataAccessException
是一个
RuntimeException
,我不能使用
@Transactional
注释的
norollboor
属性


有人能提出解决方案吗?

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

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

查看SimpleParepository中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);

一个快速的解决方案是将EmptyResultDataAccessException设置为选中的异常,因为spring在选中的异常情况下不会回滚。