首頁 >Java >java教程 >為什麼在Spring中呼叫同一個類別中的方法時@Transactional不起作用?

為什麼在Spring中呼叫同一個類別中的方法時@Transactional不起作用?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-19 07:51:08322瀏覽

Why Doesn't @Transactional Work When Calling a Method Within the Same Class in Spring?

同一個類別中的 Spring @Transaction 方法呼叫:意外行為

在 Spring 中,像 @Transaction 這樣的註解可以讓開發者輕鬆管理交易。然而,當嘗試從定義它的同一個類別中呼叫事務方法(@Transactional)時,會出現一個特殊的問題。

具體來說,開發人員可能會遇到這樣的情況:同一類別中的呼叫者方法包含@Transactional 方法無法觸發預期的事務行為。為了解決這個問題,讓我們深入探討根本原因。

CGLIB 和 AspectJ

Spring 預設的事務處理機制使用 CGLIB 動態產生和增強 Java 類別來為 Spring Bean 建立代理。然而,CGLIB 在處理同一類別中的方法呼叫時面臨限制。因此,當您從同一個類別中呼叫 @Transactional 方法時,CGLIB 無法攔截事務,從而導致事務行為的缺失。

面向方面程式設計 (AOP)

這個問題的解決方案在於利用面向方面程式設計(AOP)來處理事務。 AOP 允許我們在不修改原始程式碼本身的情況下攔截和修改程式行為。

AspectJ 的設定

要設定 Spring 使用 AspectJ 進行交易管理,必須新增以下設定:

<tx:annotation-driven mode="aspectj"/>

如果使用 Spring 3.0以下版本,也必須加入:

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

重構程式碼

另一個可行的解決方案,特別是在 AOP 不可行的情況下,是重構程式碼。不要從同一個類別中呼叫事務方法,而是建立一個單獨的類,將事務處理委託給事務方法。這種方法可以確保 Spring 預設的事務處理機制正常運作。

以上是為什麼在Spring中呼叫同一個類別中的方法時@Transactional不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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