1. 程式人生 > >Spring事務異常回滾,捕獲異常不丟擲就不會回滾

Spring事務異常回滾,捕獲異常不丟擲就不會回滾

最近遇到了事務不回滾的情況,我還考慮說JPA的事務有bug? 我想多了.......  
  為了列印清楚日誌,很多方法我都加tyr catch,在catch中列印日誌。但是這邊情況來了,當這個方法異常時候 日誌是列印了,但是加的事務卻沒有回滾。

  例:  
   類似這樣的方法不會回滾 (一個方法出錯,另一個方法不會回滾) :  

  1. if(userSave){          
  2.     try {         
  3.         userDao.save(user);          
  4.         userCapabilityQuotaDao.save(capabilityQuota);         
  5.      } catch (Exception e) {          
  6.         logger.info("能力開通介面,開戶異常,異常資訊:"+e);         
  7.      }         
  8.  }  

下面的方法回滾(一個方法出錯,另一個方法會回滾):
  1. if(userSave){         
  2.      try {          
  3.         userDao.save(user);          
  4.         userCapabilityQuotaDao.save(capabilityQuota);         
  5.        } catch (Exception e) {         
  6.         logger.info("能力開通介面,開戶異常,異常資訊:"+e);          
  7.         throw new RuntimeException();         
  8.      }          
  9. }  
或者:
  1. if(userSave){          
  2.     try {          
  3.         userDao.save(user);          
  4.         userCapabilityQuotaDao.save(capabilityQuota);          
  5.     } catch (Exception e) {          
  6.         logger.info("能力開通介面,開戶異常,異常資訊:"+e);          
  7.         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();         
  8.     }         
  9.  }  

為什麼不會滾呢??是對Spring的事務機制就不明白。!! 
   預設spring事務只在發生未被捕獲的 runtimeexcetpion時才回滾。  
   spring aop  異常捕獲原理:被攔截的方法需顯式丟擲異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,預設情況下aop只捕獲runtimeexception的異常,但可以通過  
    
配置來捕獲特定的異常並回滾  
  換句話說在service的方法中不使用try catch 或者在catch中最後加上throw new runtimeexcetpion(),這樣程式異常時才能被aop捕獲進而回滾
  解決方案: 
  方案1.例如service層處理事務,那麼service中的方法中不做異常捕獲,或者在catch語句中最後增加throw new RuntimeException()語句,以便讓aop捕獲異常再去回滾,並且在service上層(webservice客戶端,view層action)要繼續捕獲這個異常並處理
  方案2.在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常(現在專案的做法)

另外,還發現一個問題。

同一個類中,A方法呼叫B方法,B上加@Transactional, B手工拋RuntimeException異常, 發現事務沒有回滾。但是如果把A方法放在另一個類中,呼叫B方法,B的事務就會正常工作。不知道是啥問題導致的?

相關推薦

java事務異常——Spring事務異常捕獲異常

最近遇到了事務不回滾的情況,我還考慮說JPA的事務有bug? 我想多了.......     為了列印清楚日誌,很多方法我都加tyr catch,在catch中列印日誌。但是這邊情況來了,當這個方法異常時候 日誌是列印了,但是加的事務卻沒有回滾。   例:      類

十六、Spring事務異常捕獲異常

最近遇到了事務不回滾的情況,我還考慮說JPA的事務有bug? 我想多了……. 為了列印清楚日誌,很多方法我都加tyr catch,在catch中列印日誌。但是這邊情況來了,當這個方法異常時候 日誌是列印了,但是加的事務卻沒有回滾。 例: 類似這樣的方法不會回滾 (一個方法出錯,另一個方

Spring事務異常捕獲異常

最近遇到了事務不回滾的情況,我還考慮說JPA的事務有bug? 我想多了.......     為了列印清楚日誌,很多方法我都加tyr catch,在catch中列印日誌。但是這邊情況來了,當這個方法異常時候 日誌是列印了,但是加的事務卻沒有回滾。   例:      

Spring事務異常捕獲異常拋出

actions .info time tpi detail ava ogg ren tool 最近遇到了事務不回滾的情況,我還考慮說JPA的事務有bug? 我想多了....... 為了打印清楚日誌,很多方法我都加tyr catch,在catch中打印日誌。但是這邊情

Spring事務捕獲異常

專案中一個對外提供的介面用try catch捕獲異常後不會滾 類似這樣的方法不會回滾 (一個方法出錯,另一個方法不會回滾) : if(userSave){ try { userDao.save

spring事務service中捕獲異常

參考文章:http://blog.csdn.net/yipanbo/article/details/46048413       spring事務機制:       預設spring事務只在發生未被捕獲的RuntimeException時才回滾。       spring

Spring事務管理只對出現執行期異常進行

使用spring難免要用到spring的事務管理,要用事務管理又會很自然的選擇宣告式的事務管理,在spring的文件中說道,spring宣告式事務管理預設對非檢查型異常和執行時異常進行事務回滾,而對檢查型異常則不進行回滾操作。那麼什麼是檢查型異常什麼又是非檢查型異常呢?最簡

SpringBoot | 第九章:Spring boot 資料來源未配置啟動異常

1、問題 在使Springboot自動生成的專案框架時如果選擇了資料來源,比如選擇了mysql依賴,生成專案之後,在沒有任何的配置時啟動會報一下異常,執行程式後,控制檯輸出錯誤日誌: 2018-12-04 14:00:46.890  WARN 6592 --- [ &n

Python Flask捕獲異常捕獲404錯誤errorhandler()自定義異常處理函式

  demo.py(捕獲異常,自定義異常處理函式): # coding:utf-8 from flask import Flask app = Flask(__name__) # 捕獲404異常錯誤 @app.errorhandler(404) # 當發生404錯誤時,會被

c++異常處理異常宣告捕獲異常

C++ 捕獲異常的一些規則: 1.  非MFC 的c++ 異常應該用過引用來捕獲。使用引用來捕獲異常不需要刪除c++ 異常物件。因為使用引用捕獲的異常物件會在棧中傳遞。而且保持了多型性,使得你捕獲的異常正是你丟擲的異常物件。使用指標捕獲異常的話,需要你刪除異常

第三節:使用Log4net和過濾器記錄異常信息返回異常給前端

ctc div json member nco 時間 header str resharp 上次面試,遇到,在項目中如何處理業務異常和代碼異常,使用txt記錄異常信息後,如何直接區分出異常的類型,異常怎麽分類處理,希望大家能幫我提出寶貴的意見,完善處理異常, 統一返回參數

java異常練習題:定義一個MulException類繼承Exception類要求兩數相乘等於100報錯在主類中定義一個方法在方法中異常在主方法觀察結果

題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。  定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義

1).定義一個MulException類繼承Exception類要求兩數相乘等於100報錯在主類中定義一個方法在方法中異常在主方法觀察結果。

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟

無法捕獲異常:Java關於在catch中一個異常給外圍函式卻捕獲到該異常的思考

先給出一串程式碼: public class TestException { public TestException(){ } boolean testEx()throws Exception{ boolean ret=true; try{ r

MFC異常處理機制獲取異常引起的錯誤

try { 檢測的程式碼 } catch(CException* e) { TCHAR szCause[255]; CString strFormatted; e->GetErrorMessage(szCause, 255); strFormatted = _T("T

使用 shiro 框架認證錯誤但是控制器未任何異常

1,shrio如果認證出錯,但是沒有丟擲異常  主要原因可能是 1,資料庫連線錯誤, 博主在測試的時候登入,但是登入錯誤,使用dug也沒有找出來。重要的是控制器檢視沒有一點報錯, 最後發現是資料庫的連線的名稱寫錯了 shiro沒有找到對應的表, 2。shiro從資料庫中

Java 列舉查詢異常的實現

Java列舉的values() 查詢時,如果傳入無效的名稱則會拋錯。初學者不態注意的話就會直接try catch 返回 null來處理異常,我們知道異常不應該用於控制流。 try { return Function.valueOf(name); } catch (Exce

微信自動Python幾行代碼搞定了消息在錯過

天突 b2c 百度搜 接口 python 幫助文檔 分析 caption req 之前寫過一篇python-requests獲取好友列表的文章,簡直花費了好多的時間和精力,又抓包,又找參數,又分析的,簡直麻煩透頂,今天突然知道了另外一種捷徑,幾行代碼就可以完成...

spring多模組依賴時被依賴模組的配置檔案生效的問題解決

maven專案中,現有一個web模組,對外提供http服務的,還有一個內部log模組是專門記錄日誌的,其中兩個模組,都有一個application.yml配置檔案,在配置的過程中,我遇到的問題是,web模組dependency log模組時,log模組的配

Qt - QDialog,QWidget實現模態及非模態(模態Widget能有父窗口如果設置無邊框能阻塞父窗口但是可以強行設置指定Qt::Dialog還可以setAttribute(Qt::WA_ShowModal)很多講究)good

col set print png 運行時 操作 qwidget 對話 idg 在Qt中QDialog為“窗口”,而QWidget為“部件”,首先還是了解下《Qt 窗口與部件的概念》。 對於 QDialog 的模態及非模態是