ロールバックのみとしてマークされたトランザクション: 原因を見つけるにはどうすればいいですか? 質問する

ロールバックのみとしてマークされたトランザクション: 原因を見つけるにはどうすればいいですか? 質問する

@Transactional メソッド内でトランザクションをコミットする際に問題が発生しています。

methodA() {
    methodB()
}

@Transactional
methodB() {
    ...
    em.persist();
    ...
    em.flush();
    log("OK");
}

methodA()からmethodB()を呼び出すと、メソッドは正常に通過し、ログに「OK」が表示されます。しかし、その後、

Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    at methodA()...
  1. 例外では methodB のコンテキストが完全に欠落していますが、これは問題ないのでしょうか?
  2. methodB() 内の何かがトランザクションをロールバックのみとしてマークしましたか? どうすればそれを確認できますか? たとえば、次のようなものをチェックする方法はありますか?getCurrentTransaction().isRollbackOnly()?このように、メソッドをステップ実行して原因を見つけることができます。

ベストアンサー1

メソッドを としてマークすると@Transactional、メソッド内で例外が発生すると、その周囲の TX がロールバックのみとしてマークされます (例外をキャッチした場合でも)。@Transactionalロールバックを防ぐために、次のようにアノテーションの他の属性を使用できます。

@Transactional(rollbackFor=MyException.class, noRollbackFor=MyException2.class)

おすすめ記事