2011-02-09 18 views
1

たとえば、私たちは という2つのメソッドを持ち、そのうちの1つ(testA)がもう1つ(testB)を実行するBeanサービスを持っています。同じサービスの実行サービスメソッドのためのSpringトランザクション管理

public class TestServiceImpl implements TestService { 
... 
public void testA() throws Exception { 
    ...  
    try { 
     this.testB(); 
    catch(Exception e) 
    { 
     ... 
    } 
    ... 
} 
public void testB() throws Exception { 
    ... 
} 

}

方法TESTBがPROPAGATION_REQUIRES_NEWトランザクション属性で定義され、 方法の種皮はPROPAGATION_REQUIREDで定義されています。

<bean id="TestService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="target" ref="TestServiceTarget"/> 
    <property name="transactionManager" ref="transactionManager"/> 
    <property name="transactionAttributes"> 
     <props>    
      <prop key="testB*">PROPAGATION_REQUIRES_NEW, ISOLATION_READ_COMMITTED, -Exception</prop> 
      <prop key="*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED, -Exception</prop> 
     </props> 
    </property> 
</bean> 

次に、このサービスのtestAメソッドを実行します。 ログでは、メソッドtestAに対して新しいトランザクションが作成されたことを確認できます。 testBメソッドをメソッドAから実行すると、ログに という実際のトランザクションが実際に処理され、別の1つを作成する代わりに、 という情報が使用されます(コンフィグレーションで定義されているようなもの)

だから、私たちは同じサービスの他の方法でサービスメソッドを実行すると、 春は (メソッドTESTBのための例のように)この方法 のためにトランザクションの設定を省略し、常にPROPAGATION_REQUIRED属性を使用 こと春に正常な動作ですか?

さらに(新しいトランザクションの独立が作成され、実際には中断) すべてが戸部罰金だ(PROPAGATION_REQUIRES_NEW)このメソッドの他のサービス や構成からTESTBがある方法が同じ場合のは言わせて。

トランザクション・マネージャーは、WebSphereTransactionManagerFactoryBean(spring 2.5)として使用されます。

ありがとう

答えて

1

はい、これは正常な動作です。

説明といくつかの回避策については、7.6.1 Understanding AOP proxiesを参照してください。 Spring - @Transactional - What happens in background?も参照してください。

+1

まあ、それは正常ではないかもしれませんが、これはSpringトランザクションのよく知られた問題です:http://nurkiewicz.blogspot.com/2009/08/spring-aop-riddle.html、http://nurkiewicz.blogspot。 com/2009/09/spring-aop-riddle-demystified.html –

+0

回答とお手伝いをいただきありがとうございます。 – doctoor

関連する問題