@Transactional註解的使用:
1、在方法或者類上都可以添加。(如果在類上添加,則此類中的所有方法都會執行事務,不推薦,因爲可能後續接手開發的小夥伴添加方法的時候根本不需要執行事務);
2、觸發事務回滾有兩種方式:
- a. 方法拋出異常自動進行回滾;如果使用了try catch,要在catch中拋出異常;
- b. 手動執行回滾:在方法中添加:TransactionAsceptSupport.currentTransactionStatus().setRollBackOnly();
-
//第1種寫法 @Transactional( rollbackFor = {Exception.class} ) public String commonMoney(Receipt rpt,Moneyrecord mors){ try{ rpt.setState(1); int a=dao.insert(rpt); if(a<=0) { return"繳費失敗"; } mors.setPric(rpt.getPic()); mors.setExid(rpt.getPid()); mors.setState(1); boolean tf=mrs.custom(mors); if(!tf){ return"餘額不足"; } }catch(Exception e){ log.error("業務異常" , e) throw new Exception(); } return "OK"; } //第2種寫法 @Transactional( rollbackFor = {Exception.class} ) public String commonMoney(Receipt rpt,Moneyrecord mors){ rpt.setState(1); int a=dao.insert(rpt); if(a<=0) { return"繳費失敗"; } mors.setPric(rpt.getPic()); mors.setExid(rpt.getPid()); mors.setState(1); boolean tf=mrs.custom(mors); if(!tf){ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return"餘額不足"; } return "OK"; }
3、推薦在註解上添加@Transactional(rollbackFor = {Exception.class}),如果不加的話,方法默認只會在拋出RuntimeException時執行回滾;
原理:
添加了@Transactional註解的A類在啓動後,默認會生成一個B類,複製A類中的所有方法,如果是在A類上添加註解,則B類所有方法都會執行事務;如果只在A類某個方法上添加註解,則B類只會對那個方法執行事務。