国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

spring事務異?;貪L實例解析

2024-07-13 10:15:56
字體:
來源:轉載
供稿:網友

最近遇到了事務不回滾的情況,我還考慮說JPA的事務有bug?我想多了.......

為了打印清楚日志,很多方法我都加tyrcatch,在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時才回滾。******

springaop異常捕獲原理:被攔截的方法需顯式拋出異常,并不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,默認情況下aop只捕獲runtimeexception的異常,但可以通過。

配置來捕獲特定的異常并回滾

換句話說在service的方法中不使用trycatch或者在catch中最后加上thrownewruntimeexcetpion(),這樣程序異常時才能被aop捕獲進而回滾

解決方案:

方案1.例如service層處理事務,那么service中的方法中不做異常捕獲,或者在catch語句中最后增加thrownewRuntimeException()語句,以便讓aop捕獲異常再去回滾,并且在service上層(webservice客戶端,view層action)要繼續捕獲這個異常并處理

方案2.在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常(現在項目的做法)

總結

以上就是本文關于spring事務異?;貪L實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁安市| 皮山县| 阿克陶县| 桦甸市| 临安市| 柞水县| 渑池县| 嘉义市| 五莲县| 盱眙县| 北碚区| 奈曼旗| 石台县| 武城县| 红河县| 东兰县| 溆浦县| 娄底市| 朝阳区| 泸西县| 张家港市| 蒙自县| 张北县| 胶南市| 彰化县| 辛集市| 德清县| 龙泉市| 乌拉特前旗| 井冈山市| 南乐县| 兴业县| 广水市| 柘城县| 灵丘县| 普格县| 安阳市| 应用必备| 伊川县| 自贡市| 吉隆县|