【问题标题】:Spring: multiple transactionsSpring:多个事务
【发布时间】:2018-02-21 17:27:29
【问题描述】:

我正在使用 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();
}

【问题讨论】:

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


    【解决方案1】:

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

    在执行 findAll 之前手动刷新就可以了

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

    【讨论】:

    • 无论如何,这对于真正针对数据库执行的内容而言没有任何改变,因为实际上在选择执行之前触发的刷新期间会引发错误。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2019-02-10
    • 2016-09-19
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多