1

@Transactionalメソッド a、b、c など、 のマークが付いたメソッドがいくつかあるサービスがあります。これら 3 つのメソッドは、a -> b -> c のようにネストされています。コードサンプルは次のとおりです。

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

ただし、メソッド b には次のように注釈が付けられています。

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

ただし、MyExceptionがメソッド c からスローされると、メソッド a で例外がキャッチされ、メソッド a が終了すると、トランザクションがコミットされます。これには、例外をスローした b() の呼び出しによって実行され、ロールバックされるべきだったものがすべて含まれます(? )。私はSpring 3.0.7でSQL Server 2012 Expressを使用しています.Springの構成は次のとおりです。

<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>
4

1 に答える 1

2

メソッドはメソッドbと同じクラスにあるようaです。AspectJを使用していない場合、@Transactional-annotationsはJDK動的プロキシによって処理されます。このプロキシを介して、クラス外からの呼び出しがメソッドに移動しますa。-annotationsを有効にするには、呼び出しがプロキシを通過する必要が@Transactionalあります。たとえば、「Understanding AOPプロキシ」(http://static.springsource.org/spring/docs/3.0.0.M3/spring- )を参照してください。フレームワーク-reference/html / ch08s06.html

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

于 2012-04-06T12:53:20.723 に答える