Elasticsearch(ES)乐观锁~多版本并发控制

        ES内部基于_version进行乐观锁并发控制。在ES中,有两种version,一种是内部version,由ES来维护;另一种是外部version,需要用户自己来维护。用户可以根据实际业务场景选择不同类型的版本控制。

内部版本

        默认情况下,文档版本是由ES自己维护的。当创建文档索引时,ES会给文档的版本赋值为1,如下图中_version属性。

6563032-179cd0d43daa9e2b.png
索引文档时默认_version值为1

        每当更新一次文档,version会自动加1。如下图所示:

6563032-eb84b428f14437aa.png
更新一次version变成2
6563032-ec989e155a9d50e6.png
更新两次version变成3

        当使用内部version时,ES要求请求中的version值必须和ES中文档的的version值相同,否则会操作失败。如下图所示:

6563032-830fda6a8e8e3608.png
指定的version值比ES中文档的version小
6563032-e346f78d6b029b54.png
指定的version值比ES中文档的version大

        对于UPDATE操作,ES会先通过文档ID去GET文档,拿到文档的version之后,再对文档做Reindex。如果在GET和Reindex期间,文档被更新,version值发生变化,则更新失败。可以使用retry_on_conflict参数来设置当发生更新上述情况更新失败时,自动重试的次数。retry_on_conflict的默认值为0,即不重试。

外部版本

        当创建索引数据时,ES允许用户自己维护version,如下图所示:

6563032-58c00a47f52b6f6f.png
使用外部version

        当使用外部version时,ES要求请求中的version值必须大于ES中文档的的version值,否则操作失败。如下图所示:

6563032-dad1f947f01f97f8.png
指定的version值和ES中文档的version值相等
6563032-7d309dbc174891c8.png
指定的version值比ES中文档的version小
6563032-e96130537feffe6b.png
指定的version值比ES中文档的version大

转载于:https://www.jianshu.com/p/0264352e69bc

猜你喜欢

转载自blog.csdn.net/weixin_34233856/article/details/91073095