2011-02-24 132 views
8

我对注释@Transactional存在问题。管理交易回滚

我有一个方法做一些东西,并在里面我扔和catch。

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

以下是错误:

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

我可以添加在@Transactional无回退,因为我抛出和捕获,但我不认为这是一个真正的解决方案除外。

也许有一种方法来取消该rollbackOnly的交易,但我不认为这是最好的做法太...

那么,你有什么想法,我应该怎么办?

感谢,

回答

6
  1. 的try/catch与IllegalArgumentException听起来像一个代码味道(有效的Java项目57:Use Exceptions only for exceptional conditions

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

+0

谢谢你的回答。 (我只能阅读你给出的链接的一部分),而且我不确定你是否在讨论在我的情况下通常不使用异常,还是不使用运行时异常。注意:(我使用一个异常来警告从某些类抛出的错误到其他类) – RoD 2011-02-25 11:08:17

+0

@RoD您应该阅读Effective Java书,它是每个Java开发人员应该阅读的一本书。但要理解这一特定方面,您可以阅读本搜索返回的任何文章:[例外“流量控制”](http://www.google.com/search?q=exceptions+%22flow+control%22) – 2011-02-25 13:44:18

2

如果您不能提交事务,那么您的代码中可能有异常。通过尝试/捕捉,你会隐瞒完整的例外,并简单地得到一个微妙的通用解释。你也会得到回滚。

为了理解你的错误,并得到你的错误的完整描述,试着放下try/catch的东西,让代码爆炸。在那里你会看到你问题的真正根源。