ES内部基于_version进行乐观锁并发控制。在ES中,有两种version,一种是内部version,由ES来维护;另一种是外部version,需要用户自己来维护。用户可以根据实际业务场景选择不同类型的版本控制。
内部版本
默认情况下,文档版本是由ES自己维护的。当创建文档索引时,ES会给文档的版本赋值为1,如下图中_version属性。
每当更新一次文档,version会自动加1。如下图所示:
当使用内部version时,ES要求请求中的version值必须和ES中文档的的version值相同,否则会操作失败。如下图所示:
对于UPDATE操作,ES会先通过文档ID去GET文档,拿到文档的version之后,再对文档做Reindex。如果在GET和Reindex期间,文档被更新,version值发生变化,则更新失败。可以使用retry_on_conflict参数来设置当发生更新上述情况更新失败时,自动重试的次数。retry_on_conflict的默认值为0,即不重试。
外部版本
当创建索引数据时,ES允许用户自己维护version,如下图所示:
当使用外部version时,ES要求请求中的version值必须大于ES中文档的的version值,否则操作失败。如下图所示: