【发布时间】:2022-01-07 23:33:52
【问题描述】:
我知道当elasticsearch插入一个文档时,客户端找不到这个文档的时间很短。但我的情况是:
当我更新一个文档时,该文档不存在。于是upsert变成了insert,这个动作就成功了。
然后立即,另一个线程/进程对该文档发出更新,我是否有可能覆盖该文档,因为当时找不到该文档?
对不起我的英语不好......
【问题讨论】:
标签: java elasticsearch
我知道当elasticsearch插入一个文档时,客户端找不到这个文档的时间很短。但我的情况是:
当我更新一个文档时,该文档不存在。于是upsert变成了insert,这个动作就成功了。
然后立即,另一个线程/进程对该文档发出更新,我是否有可能覆盖该文档,因为当时找不到该文档?
对不起我的英语不好......
【问题讨论】:
标签: java elasticsearch
是的,你描述的情况是可能的。
解决这个问题的一种方法是使用refresh=wait_forquery string parameter,以确保第一个更新/更新插入调用仅在文档实际存在并且可以被第二个更新调用找到时返回。
POST index/_update/<id>?refresh=wait_for
{...}
但是,如果两个进程同时调用 update/upsert,则无法预测哪个进程会获胜。
【讨论】: