我的注释@Transactional
存在问题。
我有一种做某些东西的方法,而且我在里面扔了一个IllegalArgumentException
。
我认为(即使我已经发现异常)它将事务设置为rollbackOnly(异常抛出时的某些触发器)并且它结束时没有成功提交事务。
这是错误:
org.springframework.transaction.TransactionSystemException : Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
我可以添加@Transactional
无回滚 - 我抛出并捕获的异常,但我不认为这是一个真正的解决方案。
也许有办法在交易中取消设置rollbackOnly,但我认为这也不是最好的做法......
那么,你知道我该怎么办?
谢谢,
答案 0 :(得分:6)
尝试/捕捉IllegalArgumentException
听起来像代码气味(有效的Java项目57:Use Exceptions only for exceptional conditions)
事务是否设置为rollbackOnly
取决于所使用的代理机制。如果使用JDK代理,则处理程序位于外部,无法在方法调用中注册捕获的异常。如果您使用mode=aspectj
,情况会有所不同。此外,如果您有嵌套的事务上下文,则必须在内部方法上使用@Transactional(noRollbackFor=IllegalArgumentException.class)
。
答案 1 :(得分:2)
如果您无法提交事务,那么您的代码中可能会有异常。通过try / catch,您可以隐藏完整的异常,并简单地获得一个精致的通用解释。你也得到了回滚。
为了理解你的错误,并获得你的错误的完整描述,尝试删除try / catch事件并让代码爆炸。在那里,您将看到问题的真正根源。