Spring事務異常回滾,捕獲異常不丟擲就不會回滾
最近遇到了事務不回滾的情況,我還考慮說JPA的事務有bug? 我想多了.......
為了列印清楚日誌,很多方法我都加tyr catch,在catch中列印日誌。但是這邊情況來了,當這個方法異常時候 日誌是列印了,但是加的事務卻沒有回滾。
例:
類似這樣的方法不會回滾 (一個方法出錯,另一個方法不會回滾) :
- if(userSave){
- try {
- userDao.save(user);
-
userCapabilityQuotaDao.save(capabilityQuota);
- } catch (Exception e) {
- logger.info("能力開通介面,開戶異常,異常資訊:"+e);
- }
- }
下面的方法回滾(一個方法出錯,另一個方法會回滾):
- if(userSave){
- try {
- userDao.save(user);
- userCapabilityQuotaDao.save(capabilityQuota);
-
} catch (Exception e) {
- logger.info("能力開通介面,開戶異常,異常資訊:"+e);
- throw new RuntimeException();
- }
- }
- if(userSave){
- try {
- userDao.save(user);
- userCapabilityQuotaDao.save(capabilityQuota);
-
} catch (Exception e) {
- logger.info("能力開通介面,開戶異常,異常資訊:"+e);
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- }
- }
為什麼不會滾呢??是對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 的模態及非模態是