仅标记为回滚的事务:如何找到原因

我在@Transactional方法中提交事务时遇到问题:

methodA() {

methodB()

}

@Transactional

methodB() {

...

em.persist();

...

em.flush();

log("OK");

}

当我从methodA()调用methodB()时,该方法成功通过,并且可以在日志中看到“确定”。但后来我明白了

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()?-这样,我可以逐步检查方法并找到原因。

回答:

我终于明白了这个问题:

methodA() {

methodB()

}

@Transactional(noRollbackFor = Exception.class)

methodB() {

...

try {

methodC()

} catch (...) {...}

log("OK");

}

@Transactional

methodC() {

throw new ...();

}

发生的是,即使methodB的注释正确,methodC但没有。引发异常后,第二个异常@Transactional将第一个事务标记为“仅回滚”。

以上是 仅标记为回滚的事务:如何找到原因 的全部内容, 来源链接: utcz.com/qa/397502.html

回到顶部