首頁 >Java >java教程 >為什麼在同一個類別中呼叫 Spring 事務會失敗?

為什麼在同一個類別中呼叫 Spring 事務會失敗?

Barbara Streisand
Barbara Streisand原創
2024-12-20 06:09:10458瀏覽

Why Do Spring Transactions Fail When Called Within the Same Class?

同一個類別中的事務呼叫:Spring 的困境

問題

在 Spring 中,事務方法通常以 @Transaction 來註解。當呼叫事務方法時,Spring 會自動管理事務生命週期,確保在出現異常時資料的完整性。但是,當從同一個類別中呼叫事務方法時,會出現意外行為。事務似乎被繞過了,讓開發人員摸不著頭緒。

原因:動態代理的限制

Spring 使用動態代理(例如 CGLIB)來攔截方法呼叫並應用交易行為。但是,當事務方法呼叫同一類別中的另一個事務方法時,動態代理將被繞過。這是因為兩種情況下的目標物件是相同的,並且僅為外部方法呼叫建立代理。

解決方案:採用AspectJ 或重構

要解決此問題,您有兩個選項:

  1. 設定AspectJ: Spring提供了另一種事務處理模式,使用AspectJ。透過在@TransactionManagement註解中將mode屬性設定為aspectj,Spring將使用AspectJ來管理事務。這允許同一類別中的事務呼叫按預期工作。
  2. 重構程式碼:雖然 AspectJ 提供了解決方案,但它可能不是最優雅的方法。更簡潔的替代方法是重構程式碼,將事務操作分成不同的類別。透過讓專用的類別處理每個事務操作,您可以避免同一類別中巢狀事務呼叫的問題。

AspectJ 的設定提示

要設定AspectJ 進行交易處理,請依照下列步驟操作:

  • 新增
  • 對於3.0之前的Spring 版本,也要將以下bean 定義加入到您的配置中:

    <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
      <property name="transactionManager" ref="transactionManager" />
    </bean>

透過擁抱AspectJ 或重構您的程式碼,您可以克服Spring 預設事務處理的限制並確保一致的事務行為,即使對於同一物件中的巢狀呼叫也是如此類別。

以上是為什麼在同一個類別中呼叫 Spring 事務會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn