我的春天/ 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)似乎支持这一点。) –