簡體   English   中英

Spring中的聲明式事務管理行為異常

[英]Declarative Transaction Management in Spring behaving unpredictably

我有一個帶有聲明式事務管理的Spring + Hibernate應用程序。 我有一個服務( FooService ),其中有2個公共方法MethodAMethodB 客戶端將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編織AspectJ字節碼時

為什么會這樣呢?

Spring的默認AOP機制是JDK動態代理 ,它創建一個單獨的Proxy實例來實現您的服務接口。 此代理將代替您的服務注入到其他bean中,並且通過它的所有調用都會在委派給您的服務之前進行事務處理。 由於您的服務與自身之間的呼叫不會通過代理進行,因此無法或將不會啟動任何交易。 使用AspectJ字節碼編織,事務代碼將直接編織到您的服務中,並且可以正常工作。 但是,如果您發現自己為此目的需要它,那么最好將您的“服務”重構為至少兩個單獨的對象,因為這表明您已將關注點和/或跨過抽象層混合使用一堂課

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM