繁体   English   中英

Spring Data Jpa-缓存

[英]Spring Data Jpa - cache

您好我的问题是我无法避免缓存。 我在Spring Boot 1.5.4中使用Spring Data Jpa

我在做什么:有一种情况,当某个客户端向我的REST端点请求一些数据,并基于这些数据创建实体并将其保存到数据库中时,接下来我请求另一个REST端点,该端点会直接响应我,但是我请求我还没有完成。 接下来,我正在等待另一个服务,该服务必须请求我的另一个REST端点(第一个客户端一直在线)。 这个端点修改了在我收到第一个请求后创建的实体,这里出现了问题。

因此,基本上,第一个请求创建实体,并使用“ saveAndFlush”方法将其保存。 当第一个请求正在等待时,另一个线程使用spring数据jpa修改此实体:

@Modifying(clearAutomatically = true)
@Query("UPDATE QUERY ")
@Transactional
int updateMethod();

但是在那之后(当等待中释放第一个请求时),当我在第一个线程中调用findOne方法时,我得到了旧实体,我也尝试了重写方法:

@Transactional
default MyEntity findOneWithoutCache(Long id) {
    return findOne(id);
}

但这也行不通,我还补充道

@Cacheable(false)
public class MyEntity {

而且这也不起作用。

当我以这种方式使用@Query选择此实体时,只有一种方法有效:

@Query("SELECT STATEMENT "
        + "WHERE p.id = ?1")
MyEntity findEntityById(Long id);

您能解释一下如何解决这个问题吗?

问题是您具有哪种事务隔离? 什么数据库,设置,驱动程序?

理论上,在理想的ACID事务中-开始事务后,您将看不到其他事务中所做的更改。 (请参阅重复读取)。

另一方面,通常您在ACID中没有I。 而且隔离性较弱。 (如“读取已提交”)。

如果查询有效,则表明您没有“可重复读”-因此,也许您应该简单地获取EnityManager(通过JpaContext)并尝试clear()会话(在第一个线程中)?

暂无
暂无

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

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