私は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 --<
}