在 Spring 中,事務方法通常以 @Transaction 來註解。當呼叫事務方法時,Spring 會自動管理事務生命週期,確保在出現異常時資料的完整性。但是,當從同一個類別中呼叫事務方法時,會出現意外行為。事務似乎被繞過了,讓開發人員摸不著頭緒。
Spring 使用動態代理(例如 CGLIB)來攔截方法呼叫並應用交易行為。但是,當事務方法呼叫同一類別中的另一個事務方法時,動態代理將被繞過。這是因為兩種情況下的目標物件是相同的,並且僅為外部方法呼叫建立代理。
要解決此問題,您有兩個選項:
要設定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中文網其他相關文章!