<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 一、原理 如果包含@Transactional注解,Spring會為這個bean動態地生成一個子類(即代理類,proxy),代理類是繼承原來那個bean的;此時,當這個有注解的方法被調用的時候,實際上是由代理類來調用的,代理類在調用之前就會啟動transaction。然而,如果這個有注解的方法是被同一個類中的其他方法調用的,那么該方法的調用并沒有通過代理類,而是直接通過原來的那個bean,所以就不會啟動transaction; 當Spring發現@Transactional或者@Async時,會自動生成一個ProxyObject,示意圖如下: ![](https://img.kancloud.cn/27/bf/27bf571355ed4178801461fbeee3c9b4_998x518.png) ## 二、規則 ### **基本要點** @Transactional的作用域**是當前方法**,當前方法體內部執行出現符合規則的異常且沒有被捕獲,就會出現回滾; **只有異常傳播拋出了標記了 @Transactional 注解的方法,事務才能回滾** ### **異常類型** 對于@Transactional可以保證RuntimeException(及其子類)及Error錯誤的回滾,如果想保證非RuntimeException異常也進行回滾,需要加上rollbackFor = Exception.class 參數; 例如: ``` @Transactional(rollbackFor = Exception.class) ``` 這樣標識的方法,無論其代碼執行中遇到什么異常,都會回滾; ### **異常不能捕獲** 異常回滾,必須捕獲到異常,一般來說,業務層不要捕獲異常,而是拋出去,這樣,業務層出現異常,就會回滾,否則,被處理掉的異常,是不可能觸發事務回滾的; >[info] 簡單來說,異常在方法內部被捕捉了,會導致@Transactional無效; ### **不能同類方法調用** 同一個類的不同方法,A方法沒有@Transactional,B方法有@Transactional,則A調用B方法,事務不起作用; >[info] 比如說,如果需要做事務分解,把一個列表對象輪詢業務整體事務拆分的時候,需要單獨定義類和方法,再注入原Bean引用才可以; ### **公開且非final方法** 必須是public非final方法才可以支持事務; ### **非靜態方法** 基于動態代理,故不得是靜態方法; ### **多@Transactional調用** 1、無@Transactional方法,調用兩個@Transactional事務方法,互不干擾; 2、如果@Transactiona方法繼續調用@Transactional方法,則需要看propagation的定義;可以在一個事務方法中,調用另外一個@Transactional(propagation = Propagation.REQUIRES_NEW),計時在主事務中失敗回滾,依然確保子事務正常提交; 實例: ``` @Component public class CheckRealName { @Autowired private CardInfoDao cardInfoDao; @Autowired private RayLocker rayLocker; @Transactional(propagation = Propagation.REQUIRES_NEW) public void doAction(CardInfo cardinfo) throws Exception { String lockKey = rayLocker.getUniqueKey(CardInfo.class, cardinfo.getCardId()); if (rayLocker.lock(lockKey)) { try { cardinfo.setRealNameStatus(ApiFacade.isRealNameCertified(cardinfo) ? CardRealNameStatus.real_named : CardRealNameStatus.not_real_named); cardInfoDao.save(cardinfo); } finally { rayLocker.unlock(lockKey); } } } } ``` CheckRealName.doAction可以被另外的@Transactional事務調用,并作為子事務; ### **異步任務事務** 參考:[后端框架/SprigBoot/核心技術/異步任務](../../%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1.md) ## 三、失效場景 ![](https://img.kancloud.cn/6d/da/6ddafcd87119094facb3c365034d0c96_1080x1071.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看