我有以下代码:
(线程一次只能访问一个特定obj的synchronized(someObj)
。)
@Async
public void funcA() {
synchronized (someObj) {
//query (using spring) for **some_data_in_ES**
//check if **some_data_in_ES** is not 'nothing'
//update **some_data_in_ES** to be 'A' using spring
}
}
@Async
public void funcB() {
synchronized (someObj) {
//query (using spring) for **some_data_in_ES**
//check if **some_data_in_ES** is not 'nothing'
//update **some_data_in_ES** to be 'B' using spring
}
}
如果funcA控制了synchronized(someObj)
并将 some_data_in_ES 更新为' A'当synchronized(someObj)
上的锁定空闲时,funcB会自动加入synchronized(someObj)
,并检查 some_data_in_ES 是否“没有”#39;
是否有可能B会得到什么'或者弹性搜索只会在更新为' A'?
答案 0 :(得分:0)
B是否有可能获得'没有'或者弹性搜索只会在更新为'A'之后返回some_data_in_ES?
是B可以看到“没有”或“A”。 ES的更新不是原子的。您将看到更新的速度取决于ES和Lucene的配置方式。所以这都是时间和配置问题。我过去处理问题的一种方法是使用我在ES中索引的数据库中的ID。这样我可以肯定它是独一无二的,并且使用它来编写upsert和更新是微不足道的。
签出update API,例如,upsert可能是合适的。
阅读near real-time search,了解有关文档何时可见的更多信息。特别要注意刷新间隔和刷新API。