繁体   English   中英

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

[英]JPA repository doesn't perform update when called in Catch clause before throwing exception

我面临一个奇怪的问题,我创建了一个异步方法来进行一些处理,如果一切顺利,我将通过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它将正常工作!

如果您的异常是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

事务注释类型通常可以直接与Spring的RuleBasedTransactionAttribute类进行比较,而事实上AnnotationTransactionAttributeSource会将数据直接转换为后者,因此Spring的事务支持代码不必知道注释。 如果没有规则与异常相关,则将其视为DefaultTransactionAttribute(在RuntimeException和Error上回滚,但在检查的异常上不回滚)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM