java - Spring:多个事务

标签 java spring spring-boot spring-data-jpa

我正在使用 spring boot 和 spring-data-jpa 开发一个应用程序,其中我有一个方法可以执行两件事:

  1. 它使用 JpaRepository 将元素列表保存到数据库中,因此方法 save 标记有 @Transactional。

  2. 它刷新缓存,因此它使用相同的 JpaRepository 对数据库执行查找所有操作。

如果列表的某个元素有错误(例如不允许的空值),我想回滚保存列表操作并且不执行查找所有查询,但它正在执行查找查询并抛出此时提交异常。

我尝试过不同类型的传播策略,但没有成功。 我也知道我可以将查找查询取出到外部方法,但对于封装问题我宁愿不这样做。

下面是方法:

@Transactional(rollbackFor=Exception.class)
public synchronized void saveMessageFilters(List<MessageFilter> list) {
    logger.debug("Insert or update message filters <{}>", list);
    for (MessageFilter filter : list) {
        checkIfMessageFilterExists(filter);
        MessageFilter messageFilter = messageFilterRepository.save(filter);
        logger.info("Message filter <{}> processed",messageFilter);
    }
    List<MessageFilter> messageFilters = (List<MessageFilter>)messageFilterRepository.findAll();
}

最佳答案

JPA 可能会在执行 findAll 之前刷新挂起的更新操作,这就是它在 findAll 方法上触发错误的原因。

只需在执行 findAll 之前手动刷新即可解决问题

messageFilterRepository.flush();
List<MessageFilter> messageFilters = (List<MessageFilter>)messageFilterRepository.findAll();

关于java - Spring:多个事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48901744/

相关文章:

java - 使用 Active Directory 重定向 Azure 上 Spring OAuth2 应用程序的 URL : Invalid Redirect URI Parameter

java - IBM Websphere 8.5.5在Servlet 3.0中使用数据源4.0版本

java - 我需要我的 Spring Boot Web 应用程序在 JUnit 中重新启动

java - @BatchSize 但在获取 @ManyToOne 关联时有很多往返

java - Oracle 应用服务器上每个 Java VM 的单独 GC 日志文件

java - 在已签名的小程序中使用 AccessControler.doPrivileged 时出现 InvocableTargetException

java - 使用 Freemarker 对 Spring Boot 应用程序进行单元测试抛出 NoSuchMessageException

java - 如何替换 thymeleaf 链接中的 URL 参数?

java - 为什么@RelatedToVia 有可选的类型和元素类参数?

java - 使用泛型的工厂对象创建者