如何避免 org.springframework.transaction.UnexpectedRollbackException?

Thi*_*yão 6 spring spring-boot

当一个方法被@Transactional 注释并且有运行时异常时,spring 吃掉这个异常并抛出:

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
Run Code Online (Sandbox Code Playgroud)

如何避免这种“一般”异常并传播原始异常,但保持回滚?

谢谢。

Ken*_*han 12

org.springframework.transaction.UnexpectedRollbackException:事务静默回滚,因为它已被标记为仅回滚

如果您有外部@Transactional方法调用内部@Transactional方法,通常会发生这种情况。当内部方法抛出异常,而外部方法捕获该异常并正常返回时,Spring很困惑,不知道是否应该回滚或提交事务,因为这两种方法相互矛盾。(内部方法说要回滚,但外部方法说要提交)

因此,请检查是否有任何@Transactional捕获异常的外部方法。如果是,则从外部方法重新抛出该异常,以便整个事务将回滚。

  • @KenChan 如何做到这一点?我尝试在内部或外部方法中添加“rollbackFor = Exception.class”,但似乎都不起作用。我只想回滚并忽略该异常。 (2认同)