[英]Declarative Transaction Management in Spring behaving unpredictably
我有一個帶有聲明式事務管理的Spring + Hibernate應用程序。 我有一個服務( FooService
),其中有2個公共方法MethodA
和MethodB
。 客戶端將call
MethodA
,然后依次調用MethodB
。
Client -> MethodA -> MethodB
我希望事務僅從MethodB開始。 這是我的Spring應用程序上下文中的片段:
<bean id="FooService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="target" ref="FooServiceTarget" />
<property name="transactionAttributes">
<props>
<prop key="MethodB">PROPAGATION_REQUIRED,-FooException</prop>
</props>
</property>
</bean>
但是,當我從客戶端調用MethodA
時,在調用MethodB
時它不會創建事務代理。 如果我還在應用程序上下文中將MethodA
添加到Bean配置中,則將調用事務代理(按預期方式啟動MethodA
)。 為什么會這樣呢? 我可以實現僅從MethodB開始創建的事務嗎?
客戶端->方法A->方法B
我希望事務僅從MethodB開始
這行不通。 方法A和方法B在同一代理內。
唯一正確的做法是將方法B移到另一個Bean中。
順便說一句:這已經被問過很多次了,這是我以前的一些回答:
我可以實現僅從MethodB開始創建的事務嗎?
為什么會這樣呢?
Spring的默認AOP機制是JDK動態代理 ,它創建一個單獨的Proxy實例來實現您的服務接口。 此代理將代替您的服務注入到其他bean中,並且通過它的所有調用都會在委派給您的服務之前進行事務處理。 由於您的服務與自身之間的呼叫不會通過代理進行,因此無法或將不會啟動任何交易。 使用AspectJ字節碼編織,事務代碼將直接編織到您的服務中,並且可以正常工作。 但是,如果您發現自己為此目的需要它,那么最好將您的“服務”重構為至少兩個單獨的對象,因為這表明您已將關注點和/或跨過抽象層混合使用一堂課
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.