日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
日常Bug排查-拋異常不回滾

 前言

日常Bug排查系列都是一些簡單Bug排查,筆者將在這里介紹一些排查Bug的簡單技巧,同時順便積累素材^_^。

Bug現(xiàn)場

最近有人反映java應(yīng)用操作數(shù)據(jù)庫的時候,拋異常不回滾。這還了得,不過筆者篤定肯定是用法的鍋,不然就全亂套了。所以筆者去Review他的代碼。

代碼片段

 
 
 
 
  1. @Transacion(value="x")  
  2. public void s1() throw MyException{  
  3.     update(1);  
  4.     throwBusinessException(); 
  5.     update(2);  

乍看上去沒啥問題。

思路

筆者用@Transaction注解也用了好幾年了,從來沒遇到過拋異常不回滾的情況。看他的用法也和筆者差不多呀?

然后筆者稍微思索了會,發(fā)現(xiàn)我寫的代碼和出問題的這一段稍稍有些不一樣。我是這么寫的:

 
 
 
 
  1. @Transacion(value="transManager")  
  2. public void s1(){  
  3.     update(1);  
  4.     update(2);  

貌似我從來沒有在函數(shù)上加過throw MyException,難道是這段有問題?翻看MyException代碼,發(fā)現(xiàn)它僅僅繼承了Exception。

 
 
 
 
  1. class MyEception extends Exception { 

好像就這點不一樣。而筆者自定義的Exception基本繼承了RuntimeException的。

翻下Spring源碼

按照這個思路,筆者去翻了下Spring的源碼,看下它在聲明式事務(wù)中的處理邏輯到底是什么,于是翻到了這一段處理事務(wù)異常的代碼:

 
 
 
 
  1. TransactionAspectSupport.java 
  2. protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) { 
  3.     if (txInfo.transactionAttribute.rollbackOn(ex)) { 
  4.     }else{ 
  5.         // We don't roll back on this exception. 
  6.         // Will still roll back if TransactionStatus.isRollbackOnly() is true. 
  7.         // 在checkedException的時候,不會被rollBack,會commit!!! 
  8.     } 
  9. @Override 
  10. public boolean rollbackOn(Throwable ex) { 
  11.     return (ex instanceof RuntimeException || ex instanceof Error); 

看代碼邏輯就明白了,只有異常繼承RuntimeException或者Error的時候才會回滾!好了,讓業(yè)務(wù)開發(fā)改了下代碼,問題解決了。

總結(jié)

遇到問題時,找到出問題代碼段和類似的正確代碼段的不同處,以此為切入,往往能抓住線索。

本文轉(zhuǎn)載自微信公眾號「解Bug之路」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系解Bug之路公眾號。


分享題目:日常Bug排查-拋異常不回滾
瀏覽路徑:http://www.dlmjj.cn/article/cohohdo.html