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

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

methodA(){
方法b()
}
@交易的
方法b(){
...
em.persist();
...
em.flush();
日志(“OK”);
}

当我从methodA()调用methodB()时,该方法成功通过,我可以在日志中看到“OK”。但是我得到了

无法提交JPA事务;嵌套异常为javax.persistence.RollbackException:标记为rollbackOnly的事务org.springframework.Transaction.TransactionSystemException:无法提交JPA事务;嵌套异常为javax.persistence.RollbackException:标记为rollbackOnly的事务
位于org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
位于org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
位于org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.commitTransactionAfterReturning(TransactionSpectSupport.java:393)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
位于org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
在methodA()中。。。
  1. methodB的上下文在异常中完全缺失——我想这没关系吧
  2. methodB()中的某些内容将事务标记为仅回滚?我怎么才能知道呢?例如,有没有一种方法可以检查像getCurrentTransaction().isRollbackOnly()这样的东西?-像这样,我可以逐步检查方法并找到原因

当您将方法标记为@Transactional时,方法中出现的任何异常都会将周围的发送标记为仅回滚(即使您捕获了它们)。您可以使用@Transactional注释的其他属性来防止其回滚,如:

@Transactional(rollboor=MyException.class,norollboor=MyException2.class)

发表评论