一、手動回滾事務
有時我們需要捕獲一些錯誤信息,又需要進行事務回滾,這時我們就需要用到Spring提供的事務切面支持類TransactionAspectSupport。
@Transactional(rollbackFor = Exception.class) @Override public void saveEntity() throws Exception{ try { userDao.saveUser(); studentDao.saveStudent(); }catch (Exception e){ System.out.println("異常了=====" + e); //手動強制回滾事務,這里一定要第一時間處理 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
手動回滾事務一定要加上@Transactional,不然會報以下錯誤:
org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
想想也是,不開啟事務,何來手動回滾,所以@Transactional必不可少。
二、回滾部分異常
使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 設置回滾點。
使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint); 回滾到savePoint。
@Transactional(rollbackFor = Exception.class) @Override public void saveEntity() throws Exception{ Object savePoint = null; try { userDao.saveUser(); //設置回滾點 savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); studentDao.saveStudent(); //執行成功 int a = 10/0; //這里因為除數0會報異常,進入catch塊 }catch (Exception e){ System.out.println("異常了=====" + e); //手工回滾異常 TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint); } }
三、DataSourceTransactionManager
spring 開啟事務以及手動提交事務,可以在服務類上加上兩個注解。
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
手動開啟事務
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
手動提交事務
dataSourceTransactionManager.commit(transactionStatus);//提交
手動回滾事務
dataSourceTransactionManager.rollback(transactionStatus);//最好是放在catch 里面,防止程序異常而事務一直卡在哪里未提交