2017-03-10 9 views
0

私は以下の2つの方法を示します。春: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は、トランザクション全体が

org.springframework.transaction.UnexpectedRollbackException以下の例外で、methodA()上で開始されたロールバックが発生します。それはされているので、 トランザクションがロールバックロールバックのみと指定

これはspriのデフォルト動作ですng @Transactional注釈。

私の場合、EmptyResultDataAccessExceptionがある場合でもトランザクションをコミットする必要があります。 EmptyResultDataAccessExceptionRuntimeExceptionなので、noRollBackForという属性の@Transactional注釈は使用できません。

誰も解決策を提案できますか?

+0

。 – pkoli

答えて

0

あなたのコードはまだ見ていませんが、特定の例外に対してトランザクションをロールバックしない方法が必要な場合は、@Transactionalアノテーションにマークすることができます。迅速な解決策は、スプリングバックチェック例外の場合はロールしないよう、EmptyResultDataAccessExceptionチェック例外にすることができ

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

関連する問題