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在选中的异常情况下不会回滚。