您好我的问题是我无法避免缓存。我在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);
你能解释一下如何解决这个问题吗?
答案 0 :(得分:1)
事情是你有什么样的交易隔离? 什么数据库,设置,驱动程序?
理论上,在完美的ACID事务中 - 在启动事务后,您无法看到在其他事务中完成的更改。 (参见可重复阅读)。
另一方面,通常你没有我在ACID。孤立感较弱。 (比如Read Commited)。
如果查询有效,则建议你没有可重复读取 - 所以也许你只需要获得EnityManager(通过JpaContext)并尝试清除()会话(在第一个线程中)?