Spring宣告式事務注意點,以及不生效情況

超級無敵強發表於2017-11-11

情況1:

class  XxxService{
    public void methodA(){
        methodB()
    }

    @Transactional
    public void methodB(){
        saveXX1();
        saveXX2();
    }
}
  • 入口,呼叫XxxService的methodA方法。methodA內部呼叫methodB方法。
  • 情況1【事務不生效】-此事methodA上沒有事務註解
  • 可以給methodA也增加@Transactional

情況2:


class  XxxService{
    @Transactional
    public void methodA(){
        methodB()
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB(){
        saveXX1();
        saveXX2();
    }
}
  • 入口,呼叫XxxService的methodA方法。methodA內部呼叫methodB方法。methodB意圖開啟新事務
  • 情況2【事務不新建立,傳播沿用methodA的事務】
  • 可以將methodB方法放到其他類中,解決問題。(即:通過YyyService.methodB()方式掉用)

注意點:

  1. 異常問題,spring預設異常是RuntimeException通過下面方法修改,@Transactional(rollbackFor = Exception.class)
  2. 回滾問題,可以通過throw new RuntimeTimeException()回滾,或者try..catch..異常後,顯示回滾。
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  1. 如果try… catch..異常後,不再次丟擲或者不顯示回滾,事務不生效
  2. 資料庫引擎要支援事務,如果是mysql,注意表要使用支援事務的引擎,比如innodb,如果是myisam,事務是不起作用的。
  3. 開啟註解事務的支援:
 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

相關文章