<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      Fork me on GitHub

      必看!導致事務失效的7大典型場景!

      @Transactional 聲明式事務失效的場景是 Java 面試中經常被問到的問題,所以今天咱們就來系統的盤點一下導致 @Transactional 失效的場景有哪些?以及導致的原因和解決方案詳解。

      1.方法訪問修飾符不是public

      以下代碼會導致 @Transactional 失效:

      @Service
      public class OrderService {
          @Transactional
          private void createOrder() { // private方法,事務不生效
              // ...
          }
      }
      

      原因分析

      Spring AOP 代理在生成代理類時,只對 public 方法生成事務代理,這是 Java 源碼層面設計原因,設計源碼如下:

      protected TransactionAttribute computeTransactionAttribute(Method method, Class<?> targetClass) {
         // Don't allow no-public methods as required.
         // 非 public 方法,設置為 null
         if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
            return null;
         }
         // 后面代碼省略....
       }
      

      解決方案

      將方法改為 public。

      2.自調用問題

      以下代碼會導致 @Transactional 失效:

      @Service
      public class OrderService {
          public void placeOrder() {
              createOrder(); // 直接調用,繞過代理
          }
      
          @Transactional
          public void createOrder() {
              // 事務操作
          }
      }
      

      原因分析

      當一個類中的非事務方法調用本類的事務方法時,調用是通過 this 直接調用,而不是通過 Spring 代理對象調用,因此事務不能生效。

      解決方案

      • 將事務方法移到另一個 Service 類中
      • 使用 ApplicationContext 獲取當前 Bean 的代理對象,如下代碼所示:
      @Autowired
      private ApplicationContext context;
      
      public void placeOrder() {
          OrderService proxy = context.getBean(OrderService.class);
          proxy.createOrder(); // 通過代理調用
      }
      

      3.異常被捕獲且未重新拋出

      以下代碼會導致 @Transactional 失效:

      @Transactional
      public void transferMoney() {
          deductMoney();
          try {
              addMoney();
          } catch (Exception e) {
              log.error("異常", e);
              // 捕獲但未拋出,事務不會回滾
          }
      }
      

      原因分析

      Spring 事務默認只在拋出未被捕獲的 RuntimeException 或 Error 時回滾。如果異常被捕獲且未拋出,代理認為方法執行成功,會提交事務。

      解決方案

      • 手動設置回滾:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      • 或重新拋出異常
      @Transactional
      public void transferMoney() {
          deductMoney();
          try {
              addMoney();
          } catch (Exception e) {
              TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
              throw e; // 或不拋出,僅setRollbackOnly
          }
      }
      

      4.事務傳播機制配置錯誤

      例如:使用了 Propagation.NOT_SUPPORTED 或 Propagation.NEVER,會導致事務被掛起或拒絕。

      特別注意 Propagation.REQUIRES_NEW:會掛起當前事務,開啟新事務,需謹慎使用,避免嵌套事務導致性能問題或死鎖。

      5.數據庫引擎不支持事務

      例如:MySQL 的 MyISAM 引擎不支持事務,必須使用 InnoDB。

      即使代碼配置了@Transactional,底層數據庫不支持也無法實現事務。

      6.方法被final或static修飾

      CGLIB 無法代理 final 方法(不能被重寫),JDK 代理也無法處理 static 方法,都會導致事務無法生效。因為 Spring/Spring Boot 是使用 CGLIB 或 JDK 代理實現的。

      7.多線程中調用事務方法

      以下代碼會導致 @Transactional 失效:

      @Transactional
      public void process() {
          new Thread(() -> {
              dao.update(); // 在子線程中,無事務
          }).start();
      }
      

      原因分析

      事務是基于線程綁定的(通過 ThreadLocal 存儲事務上下文),子線程中調用事務方法時,無法繼承父線程的事務上下文。

      解決方案

      使用事務同步或手動管理事務。

      小結

      @Transactional 聲明式事務底層是通過 CGLIB 或 JDK 代理實現的,所以事務失效的場景多半與二者相關,本文總共介紹了 7 種導致事務失效的場景,您至少要記住其中 4 種以上事務失效場景,這樣才能在面試中嶄露頭角。

      本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:場景題、SpringAI、SpringAIAlibaba、并發編程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、設計模式、消息隊列、Dify、Coze、AI常見面試題等。

      posted @ 2025-08-05 16:55  磊哥|www.javacn.site  閱讀(423)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 精品人妻蜜臀一区二区三区 | 国产日韩精品欧美一区喷水| 中文字幕有码日韩精品| 岛国岛国免费v片在线观看| 欧洲无码一区二区三区在线观看| 黑巨人与欧美精品一区| 亚洲av日韩在线资源| 久久婷婷五月综合97色直播| 中文字幕网红自拍偷拍视频| 漂亮的保姆hd完整版免费韩国 | 大伊香蕉在线精品视频75| 亚洲精品成人一二三专区| 精品一卡2卡三卡4卡乱码精品视频| 少妇极品熟妇人妻无码| 国产乱子影视频上线免费观看| 午夜福利激情一区二区三区 | 18禁超污无遮挡无码网址| 国产老妇伦国产熟女老妇高清| caoporn免费视频公开| 国内精品国产三级国产a久久 | 亚洲精品日韩中文字幕| 亚洲精品国产第一区二区| 亚洲伊人久久精品影院| 日韩一区二区三区在线观院| 亚洲精品国产免费av| 两当县| 四虎精品国产精品亚洲精| 狠狠色噜噜狠狠狠狠777米奇| 国内精品久久久久久久97牛牛| 日韩熟妇中文色在线视频| 亚洲男女羞羞无遮挡久久丫| 靖边县| 性做久久久久久久| 特级精品毛片免费观看| 2020精品自拍视频曝光| 视频一区视频二区卡通动漫| 精品 日韩 国产 欧美 视频| 亚洲无线码中文字幕在线| 亚洲情A成黄在线观看动漫尤物 | 国产精品香港三级国产av| 国产区一区二区现看视频|