2011-02-24 223 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的東西,讓代碼爆炸。在那裏你會看到你問題的真正根源。