2012-04-06 23 views
0

メソッドa、b、cを含む@Transactionalとマークされたいくつかのメソッドがあります。これらの3つのメソッドは、a - > b - > cのように入れ子になっています。SQL Server 2012のSpring @TransactionalとPROPAGATION_REQUIRES_NEW

@Transactional 
public void a() { 
    while(condition) { 
     try { 
      b(); 
     } catch(MyException e) { 
      logger.warn(e.getMessage()); 
     } 
    } 
} 

方法bは、しかし、このように注釈されている:ここでのサンプルコードでMyExceptionは方法cからスローされたときにそれが終了したときに

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {MyException.class}) 

ただし、例外がメソッドaでキャッチしているが、トランザクションはコミットされ、例外をスローしたb()の呼び出しによって何が行われたのか、ロールバックされたはずです(?)。私は、SQL Server 2012を使用しています は春3.0.7で表現し、私の春の構成は、このようなものです:思えるb

<tx:annotation-driven /> 
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
    <qualifier value="txm1"/> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/jpa-persistence.xml"/> 
    <property name="persistenceUnitName" value="Unit1" /> 
</bean> 

答えて

2

メソッドは、メソッドaと同じクラスであることを。 AspectJを使用していない場合、@Transactionalの注釈は、クラス外からの呼び出しがメソッドaに移動するJDKの動的プロキシによって処理されます。 @Transactional -annotationsは、効果があり、ここでの例を参照するための呼び出しは、「理解AOPプロキシ」の下で、プロキシ経由で移動する必要があります。http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch08s06.html

ここを理解するために重要なことは、その 内部のクライアントコードMainクラスのmain(..)にはプロキシへの参照があります。これは、そのオブジェクト参照を呼び出すメソッドが というプロキシの呼び出しであることを意味する を意味し、プロキシはその特定のメソッド 呼び出しに関連するすべての インターセプタ(アドバイス)に委譲できます。しかし、呼び出しが最終的に対象オブジェクトに到達した後は、 この場合SimplePojo参照は、 がthis.bar()やthis.foo()などのように自分自身を作るメソッド呼び出しは この参照に対して呼び出され、プロキシは呼び出されません。これは重要な意味を持っています 。つまり、自己呼び出しが に行かないと、メソッド呼び出しに関連するアドバイスが実行され、実行する機会は になります。

関連する問題