0

私は2つのトランザクションメソッドを1つずつ持っています。methodA の周りにアラウンド アスペクトが設定されていない場合、Transactional アノテーションはうまく機能します。methodA を呼び出した後、methodB を呼び出し、methodB が DB に何かを書き込み、次に methodA に戻り、例外をスローしてから methodB をロールバックします。しかし、メソッド A にアスペクトを配置すると、メソッド B はロールバックしません。そこで何が起こっているのか理解できません。伝播属性の多くの組み合わせを試しましたが、どれもうまくいかないようです。前もって感謝します。私はSpring 2.5.4を使用しています

私は applicationContext.xml にこの構成を持っています:

<!-- Aspect -->
<bean id="logAspect" class="LoggingAspect" />
<aop:config>
    <aop:aspect id="aspectLoggging" ref="logAspect" >
        <aop:pointcut id="testAround" expression="execution(* methodA(..))" />
        <!-- @Around -->
        <aop:around method="logProcess" pointcut-ref="testAround" />
    </aop:aspect>
</aop:config>

私の LoggingAspect クラスは次のようなものです:

@Aspect
public class LoggingAspect {
    public void logProcess(ProceedingJoinPoint joinPoint) throws Throwable {
        <!-- some code before -->
        try {
            Object result = joinPoint.proceed();
        } catch (Exception e) {
            log.info(e.getMessage());
            <!-- some code here -->     
        }   

        <!-- some code after -->
    }
}

MethodA は次のようになります。

@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRED)
public something methodA() throws Exception {
    methodB();
    ...
    throw new Exception("message ...");
    ...
}

MethodB は次のようになります。

@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRED)
public void methodB() throws Exception {
    <!-- insert something in db --<
}
4

1 に答える 1

3

あなたの側面に欠陥がある場合

  1. オブジェクトを常にアラウンド アスペクトから返さなければなりません
  2. 例外をキャッチして飲み込まない
public void logProcess(ProceedingJoinPoint joinPoint) throws Throwable { ... }

あなたのアスペクトには、voidこれがあるべきメソッドがObjectあり、常に への呼び出しの結果を返す必要がありますproceed()

次に、例外が発生した場合は例外をキャッチして飲み込みます。これが適切な tx、管理を中断しない場合は、常に例外を再スローする必要があります。

あなたの側面はこれにもっと似ているはずです。

@Aspect
public class LoggingAspect {
    public Object logProcess(ProceedingJoinPoint joinPoint) throws Throwable {
        <!-- some code before -->
        try {
            Object result = joinPoint.proceed();
            <!-- some code after -->
            return result;
        } catch (Exception e) {
            log.info(e.getMessage());
            <!-- some code here -->     
            throw e;
        }   
    }
}
于 2014-05-20T09:36:33.090 に答える