[英]Spring: multiple transactions
我正在使用 spring boot 和 spring-data-jpa 开发一个应用程序,我有一个方法可以做两件事:
它使用 JpaRepository 将元素列表保存到数据库中,因此方法 save 用@Transactional 标记。
它刷新缓存,因此它对具有相同 JpaRepository 的数据库执行查找所有操作。
如果列表的元素之一有错误(例如不允许的空值),我想回滚保存列表操作并且不执行查找所有查询,但它正在执行查找查询并抛出提交异常这一点。
我尝试了不同类型的传播策略,但没有任何成功。 我也知道我可以将 find 查询取出到外部方法,但对于封装问题,我宁愿不这样做。
下面你有方法:
@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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.