在引发异常之前,在Catch子句中调用JPA存储库时不会执行更新

时间:2018-08-07 14:26:05

标签: java asynchronous spring-data-jpa

我面临一个奇怪的问题,我创建了一个异步方法来进行一些处理,如果一切顺利,我将通过JPA存储库进行更新以将DB中的Flag设置为True。

万一发生异常,我调用存储库以标记False更新,然后重新抛出该异常。有趣的是,有例外时不会发生更新!

示例:

@Component
@Transactional
public class MyAsyncService{
  @Async
  public void asyncMethod() throws Exception{
    try{
        //Some Logic
        myrepo.update(true);
    } catch(Exception e) {
        myrepo.update(false);
        throw e;
    }
  }
}

一点也不例外。如果我删除了throw e,就可以了!

2 个答案:

答案 0 :(得分:1)

如果您的异常是RuntimeException,Spring将回滚事务。

从文档中

  

尽管EJB容器的默认行为会自动回滚   EJB上的系统异常(通常是运行时异常)上的事务   CMT不会在应用程序上自动回滚事务   异常(即除   java.rmi.RemoteException)。

     

Spring的默认行为   声明式事务管理遵循EJB约定(回滚   仅针对未检查的异常是自动的),通常对于   自定义此行为。

在此处了解更多信息:https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction-declarative

答案 1 :(得分:1)

  

事务注释类型通常可以直接与   Spring的RuleBasedTransactionAttribute类,实际上   AnnotationTransactionAttributeSource会将数据直接转换为   后一个类,这样Spring的事务支持代码就不会   必须了解注释。如果没有规则与   例外,它将被视为DefaultTransactionAttribute   (在RuntimeException和Error上回滚,但未选中   例外)。

如果发生任何错误,更新交易是一个坏习惯,但是为了解决您的问题,您可以添加 @Transactional(noRollbackFor= Exception.class)并忽略此异常。 trx不会回滚