我的春天/ Java Web應用程序具有@Transactional
服務,可以接觸到數據庫:如何使Spring @Transactional回滾所有未捕獲的異常?
@Transactional
public class AbstractDBService { ... }
所需的功能爲任何未捕獲拋出該向上傳播超越了服務層引起回滾。有點驚訝,這不是默認行爲,但有點谷歌搜索後嘗試:
@Transactional(rollbackFor = Exception.class)
這似乎除了當一個例外是故意吞食,而不是重新引發工作。 (具體情況是沒有找到實體的時候,猜猜這可能是重新設計的,不會拋出異常,但期望不可避免會出現其他情況 - 例如使用Thread.sleep()
時想到的是InterruptedException
)。 Then Spring complains:
org.springframework.transaction.TransactionSystemException:無法提交JPA事務;嵌套的例外是 javax.persistence.RollbackException:事務標記爲 rollbackOnly ... ..截斷 產生的原因:javax.persistence.RollbackException:事務標記爲rollbackOnly 在org.hibernate.jpa.internal。 TransactionImpl.commit(TransactionImpl.java:58) 在org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
我失去了一些東西在這裏?......有沒有一種辦法告訴Spring回滾所有未捕獲的throwables?
我很困惑。您當前的'rollbackFor'應該使'@ Transactional'代理回滾從註釋方法中拋出的任何'Exception'。那不是你看到的嗎? –
我看到,但它*也*似乎使這種'Exception'被捕獲,而不是重新拋出時,回滾嘗試回滾。 ([這個答案](http://stackoverflow.com/questions/19302196/transaction-marked-as-rollback-only-how-do-i-find-the-cause#19311268)似乎支持這一點。) –