spring事務——try{...}catch{...}中事務不回滾的幾種處理方式


原文鏈接:https://www.cnblogs.com/zjfjava/p/9963958.html  學習

 報錯:No transaction aspect-managed TransactionStatus in scope

當希望在某個方法中添加事務時,我們常常在方法頭上添加@Transactional注解

    @ResponseBody
    @RequestMapping(value = "/payment", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    @Transactional
    public Payment paymentJson(@RequestBody PaymentRequestInfo entity) {
    //method
  }

容易讓人忽略的是:方法上未加任何屬性的@Transactional注解只能在拋出RuntimeException或者Error時才會觸發事務的回滾,常見的非RuntimeException是不會觸發事務的回滾的。

如果要在拋出 非RuntimeException時也觸發回滾機制,需要我們在注解上添加 rollbackFor = { Exception.class }屬性。

    @ResponseBody
    @RequestMapping(value = "/payment", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = { Exception.class })
    public Payment paymentJson(@RequestBody PaymentRequestInfo entity) {
     //method
    }

當然,上面事務回滾的前提是添加@Transactional注解的方法中不含有try{...}catch{...}捕獲異常,使得程序運行過程中出現異常能順利拋出,從而觸發事務回滾。

在實際開發中,我們往往需要在方法中進行異常的捕獲,從而對異常進行判斷,為客戶端返回提示信息。但是此時由於異常的被捕獲,導致事務的回滾沒有被觸發,導致事務的失敗。

下面提供幾種解決方法:

1. 使用@Transactional注解,拋出@Transactional注解默認識別的RuntimeException

方法上使用@Transactional注解,在捕獲到異常時在catch語句中拋出RuntimeException。

2. 使用@Transactional(rollbackFor = { Exception.class }),拋出捕獲的非RuntimeException異常

方法上使用@Transactional(rollbackFor = { Exception.class })注解聲明事務回滾級別,在捕獲到異常時在catch語句中直接拋出所捕獲的異常。

3. 手動回滾

上面兩個在catch{...}中拋出異常的方法都有個不足之處,就是不能在catch{...}中存在return子句,所以設置手動回滾,當捕獲到異常時,手動回滾,同時返回前台提示信息。


免責聲明!

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



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