<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          日常Bug排查-拋異常不回滾

          共 1413字,需瀏覽 3分鐘

           ·

          2021-06-11 16:08

          日常Bug排查-拋異常不回滾

          前言

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

          Bug現(xiàn)場(chǎng)

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

          代碼片段

          @Transacion(value="x") 
          public void s1() throw MyException{
          update(1);
          throwBusinessException();
          update(2);
          }

          乍看上去沒(méi)啥問(wèn)題。 

          思路

          筆者用@Transaction注解也用了好幾年了,從來(lái)沒(méi)遇到過(guò)拋異常不回滾的情況。看他的用法也和筆者差不多呀?
          然后筆者稍微思索了會(huì),發(fā)現(xiàn)我寫(xiě)的代碼和出問(wèn)題的這一段稍稍有些不一樣。我是這么寫(xiě)的:

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

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

          class MyEception extends Exception {
          }

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

          翻下Spring源碼

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

          TransactionAspectSupport.java
          protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) {
          if (txInfo.transactionAttribute.rollbackOn(ex)) {
          }else{
          // We don't roll back on this exception.
          // Will still roll back if TransactionStatus.isRollbackOnly() is true.
          // 在checkedException的時(shí)候,不會(huì)被rollBack,會(huì)commit!!!
          }
          }
          @Override
          public boolean rollbackOn(Throwable ex) {
          return (ex instanceof RuntimeException || ex instanceof Error);
          }

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

          總結(jié)

          遇到問(wèn)題時(shí),找到出問(wèn)題代碼段和類(lèi)似的正確代碼段的不同處,以此為切入,往往能抓住線(xiàn)索。


          瀏覽 46
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日日干干视频 | 日本一区视频在线 | 性爱小说视频 | 国产成人精品网站 | 中文字幕免费观看视频 |