1

トランザクションを処理するために、Springの「@Transactional」アノテーションに取り組んでいます。

   @Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED,rollbackFor=SQLException.class)
public void updateBatch(Report a)
        throws SQLException, DataAccessException { insert1();insert2(); insert3(); }

しかし、場合に備えて

  • insert1()-テーブルAにデータを正常に挿入します。
  • insert2()-テーブルbにデータを正常に挿入します
  • insert3()-チェックされた例外をスローし、テーブルCにデータを挿入しません

これらの挿入は、DBへの挿入をトリガーするibatisinbuild関数です。次の例外が発生しました

"原因:org.springframework.transaction.UnexpectedRollbackException:トランザクションは、ロールバックのみとしてマークされているため、ロールバックされました
    org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:717)で
    org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)で
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)で
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)で
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)で

また、トランザクションはロールバックされません。つまり、insert1()、insert2()はロールバックされません。

私が欠けているものを教えてください

4

1 に答える 1

2

insert1とinsert2で何をしていますか?

PROPAGATION.REQUIRES_NEW属性を持つ別のトランザクションを使用していますか?はいの場合、ロールバックされません。それ以外の場合は、insert1またはinsert2でロールバックしますか?

私は同じ問題を経験しました。それはあなたが持っているものとは少し異なるかもしれませんが。私が経験したのは、AとBの2つのサービスがある状況でした。

Aはtry-catchブロックでBのメソッドを呼び出しています。BはRuntimeExceptionをスローし、Aのcatchブロックはその例外をcatched例外にラップします。

私のシナリオで何が起こったのか:-Bはトランザクションプロキシの背後にある別のクラスです-Bはトランザクションをロールバックに設定するランタイム例外をスローします-Propagation.REQUIEREDがあるので、これはAのメソッドのトランザクションと同じです-A例外をラップし、例外がRuntimeExceptionでもErrorでもないため、言及メソッドはtransactionManager.rollbackではなくtransactionManager.commitに進みます。これにより、トランザクションが以前にロールバックとしてマークされていたため、UnexpectedRollbackがスローされます。

あなたのケースは異なるかもしれません。

于 2012-08-25T21:36:09.043 に答える