2017-03-10 84 views
0

我有兩種方法如下所示。Spring:Caught EmptyResultDataAccessException導致整個事務回滾

@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()開始被rollbacked,通過以下例外

org.springframework.transaction.UnexpectedRollbackException: 事務回滾,因爲它已經標記爲僅回滾

我知道這是spri的默認行爲ng @Transactional註釋。

對於我的情況,即使存在EmptyResultDataAccessException,我也需要提交交易。由於EmptyResultDataAccessExceptionRuntimeException,因此我無法使用@Transactional註釋的noRollBackFor屬性。

任何人都可以提出解決方案嗎?

+0

一個快速的解決方案可以使EmptyResultDataAccessException檢查異常,如春不檢查的異常的情況下,回滾。 – pkoli

回答

0

我還沒有仔細研究過你的代碼,但是如果你只是需要一種不回滾特定異常事務的方法,你可以在@Transactional註釋中標記。

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