注释@Transactional出现问题。

我有一个做些事情的方法,在里面扔了IllegalArgumentException

我认为(即使我已经捕获到异常)也将事务设置为rollbackOnly(引发异常时触发某些事件),并且在没有成功提交事务的情况下结束。

这是错误:

org.springframework.transaction.TransactionSystemException : Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly

对于抛出和捕获的异常,我可以在@Transactional上添加无回滚,但是我认为这不是一个真正的解决方案。

也许有一种方法可以取消对事务的回滚,但我认为这也不是最佳实践……

那么,你知道我该怎么办吗?

谢谢,

最佳答案

  • 尝试/捕获IllegalArgumentException听起来像是代码气味(有效的Java项目57:Use Exceptions only for exceptional conditions)
  • 是否将事务设置为rollbackOnly取决于所使用的代理机制。如果使用JDK代理,则处理程序位于外部,无法在方法调用内部注册捕获的异常。如果使用mode=aspectj,情况将有所不同。另外,如果您具有嵌套的事务上下文,则必须在inner方法上使用@Transactional(noRollbackFor=IllegalArgumentException.class)
  • 10-06 08:49