国产探花免费观看_亚洲丰满少妇自慰呻吟_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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 民丰县| 邵东县| 临海市| 轮台县| 胶州市| 客服| 和林格尔县| 宽城| 乐平市| 类乌齐县| 灵山县| 紫阳县| 黔东| 巴南区| 中阳县| 保定市| 都兰县| 民乐县| 哈密市| 平武县| 吴江市| 宜川县| 项城市| 兴化市| 仁寿县| 遂平县| 德格县| 改则县| 宁阳县| 泌阳县| 旬阳县| 新闻| 巩留县| 滦南县| 通州区| 万载县| 定边县| 元朗区| 星子县| 工布江达县| 平武县|