在 Spring 中,像 @Transaction 這樣的註解可以讓開發者輕鬆管理交易。然而,當嘗試從定義它的同一個類別中呼叫事務方法(@Transactional)時,會出現一個特殊的問題。
具體來說,開發人員可能會遇到這樣的情況:同一類別中的呼叫者方法包含@Transactional 方法無法觸發預期的事務行為。為了解決這個問題,讓我們深入探討根本原因。
Spring 預設的事務處理機制使用 CGLIB 動態產生和增強 Java 類別來為 Spring Bean 建立代理。然而,CGLIB 在處理同一類別中的方法呼叫時面臨限制。因此,當您從同一個類別中呼叫 @Transactional 方法時,CGLIB 無法攔截事務,從而導致事務行為的缺失。
這個問題的解決方案在於利用面向方面程式設計(AOP)來處理事務。 AOP 允許我們在不修改原始程式碼本身的情況下攔截和修改程式行為。
要設定 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中文網其他相關文章!