管理事务回滚

时间:2011-02-24 16:49:17

标签: java hibernate spring jpa

我的注释@Transactional存在问题。

我有一种做某些东西的方法,而且我在里面扔了一个IllegalArgumentException

我认为(即使我已经发现异常)它将事务设置为rollbackOnly(异常抛出时的某些触发器)并且它结束时没有成功提交事务。

这是错误:

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

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

也许有办法在交易中取消设置rollbackOnly,但我认为这也不是最好的做法......

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

谢谢,

2 个答案:

答案 0 :(得分:6)

  1. 尝试/捕捉IllegalArgumentException听起来像代码气味(有效的Java项目57:Use Exceptions only for exceptional conditions

  2. 事务是否设置为rollbackOnly取决于所使用的代理机制。如果使用JDK代理,则处理程序位于外部,无法在方法调用中注册捕获的异常。如果您使用mode=aspectj,情况会有所不同。此外,如果您有嵌套的事务上下文,则必须在内部方法上使用@Transactional(noRollbackFor=IllegalArgumentException.class)

答案 1 :(得分:2)

如果您无法提交事务,那么您的代码中可能会有异常。通过try / catch,您可以隐藏完整的异常,并简单地获得一个精致的通用解释。你也得到了回滚。

为了理解你的错误,并获得你的错误的完整描述,尝试删除try / catch事件并让代码爆炸。在那里,您将看到问题的真正根源。