方法1:
在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常(現在項目的做法)
方法2:
例如service層處理事務,那么service中的方法中不做異常捕獲,或者在catch語句中最后增加throw new RuntimeException()語句,以便讓aop捕獲異常再去回滾,並且在service上層(webservice客戶端,view層action)要繼續捕獲這個異常並處理
//普通繳費 @Transactional 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:
設置回滾點進行回滾事務
//設置回滾點, Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); //回滾到savePoint事務點 TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);