当前位置: 首页 > 知识库问答 >
问题:

如何使Spring@Transactional回滚所有未捕获的异常?

郜俊健
2023-03-14
@Transactional
public class AbstractDBService  { ... }

所需的功能是用于任何未捕获的、向上传播到服务层之外的抛出,以导致回滚。我有点惊讶这不是默认行为,但在谷歌尝试了一下后:

@Transactional(rollbackFor = Exception.class)

这似乎起作用,除非异常被故意吞下而不被重新抛出。(特定的情况是找不到实体。我想这可以重新设计为不抛出异常,但预计不可避免地会有其他异常-例如,在使用thread.sleep()interruptedexception时,我想到的是interruptedexception)。然后Spring抱怨道:

TransactionSystemException:无法提交JPA事务;嵌套异常是javax.persistence.rollbackexception:事务标记为rollbackOnly...truncated.由:javax.persistence.rollbackException引起:在org.springframework.orm.jpa.jpatransactionManager.doCommit(jpatransactionManager.java:517)的org.hibernate.jpa.internal.transactionImpl.Commit(TransactionImpl.java:58)上标记为rollbackOnly的事务

我是不是漏掉了什么?...有办法告诉Spring回滚所有未捕获的抛物吗?


共有1个答案

马晓博
2023-03-14

如果要回滚所有未捕获的抛物,可以在注释中指定:

@Transactional(rollbackFor = Throwable.class)

默认情况下,Spring不会回滚错误子类,这可能是因为一旦抛出错误,JVM是否处于足够好的状态以对其进行任何处理似乎是可疑的,此时事务可能会超时。(如果在引发OutOfMemoryError时尝试回滚,最有可能的结果是另一个OutOfMemoryError。)所以你可能不会从中获得太多。

当您提到吞下异常的情况时,不可能期望Spring知道这一点,因为异常没有找到它到达Spring的代理(它正在实现事务性功能)的方法。这就是在您的RollbackException示例中发生的情况,Hibernate已经发现了需要回滚的事务,但Spring没有得到备忘录,因为有人吃了异常。所以Spring不会回滚事务,它认为一切正常,并试图提交,但提交失败,因为Hibernate将事务标记为仅回滚。

 类似资料:
  • 我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否

  • 我有以下方法: 它在内部调用: 第二个方法有一个try/catch persistenceException。问题是事务回滚,然后到达PersistenceException。 编辑4-更多信息: 1)从apply中删除@transactional,将@transaction仅保留在此异常的applyLog结果上: javax.persistence.persistenceException:or

  • 在上面的代码中,我希望操作A1会回滚,因为没有捕获异常并导致事务结束,而操作A2会成功,因为在事务结束前捕获并正确处理了异常。但是Spring会把两者都回滚。 在上面的代码中,我希望operationB总是回滚,因为事务是由启动的,异常是跨事务边界抛出的。

  • 我使用的是Spring Boot应用程序,在上面我试图实现事务性管理。但是Spring不会回滚用相同方法保存的数据。 代码库:https://github.com/vinothr/spring-boot-transactional-example

  • 问题 怎样捕获代码中的所有异常? 解决方案 想要捕获所有的异常,可以直接捕获 Exception 即可: try: ... except Exception as e: ... log('Reason:', e) # Important! 这个将会捕获除了 SystemExit 、 KeyboardInterrupt 和 GeneratorExit 之外的所有异常。

  • 问题内容: 我已成功将此注释用于Dao类。回滚适用于测试。 但是现在我需要回滚真实代码,而不仅仅是测试。有用于测试的特殊注释。但是哪些注释适用于非测试代码?对我来说这是一个大问题。我已经花了一天的时间。官方文档不符合我的需求。 employeeDao is 这是一个注释可以很好地运行的测试: HibernateDaoBeans.xml 是的,我回滚了交易。我刚刚为服务添加了BEAN …,然后注释@