注释@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)
。