Spring宣告式事務注意點,以及不生效情況
阿新 • • 發佈:2019-01-31
情況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()方式掉用)
注意點:
- 異常問題,spring預設異常是RuntimeException通過下面方法修改,@Transactional(rollbackFor = Exception.class)
- 回滾問題,可以通過throw new RuntimeTimeException()回滾,或者try..catch..異常後,顯示回滾。
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- 如果try… catch..異常後,不再次丟擲或者不顯示回滾,事務不生效
- 資料庫引擎要支援事務,如果是mysql,注意表要使用支援事務的引擎,比如innodb,如果是myisam,事務是不起作用的。
- 開啟註解事務的支援:
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>