Spring手動事務回滾


一、手動回滾事務

有時我們需要捕獲一些錯誤信息,又需要進行事務回滾,這時我們就需要用到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 里面,防止程序異常而事務一直卡在哪里未提交

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM