写点什么

Elasticsearch Document 的 _version 元数据

用户头像
escray
关注
发布于: 2021 年 01 月 23 日
Elasticsearch Document 的 _version 元数据

文字内容整理自 B 站中华石杉的 Elasticsearch 顶尖高手系列课程核心知识篇


对于为什么需要并发控制,我觉的不需要解释(如果你想听,那么可以留言,我补一篇),和所有的数据库系统所面临的问题是一样的。乐观锁、悲观锁,这些也都是常见的概念。

悲观锁


优点:方便,直接加锁,对应用程序透明,不需要额外操作

缺点:并发能力很低,同一时间只能有一个线程操作数据

乐观锁


优点:并发能力很高,不给数据加锁,大量线程并发操作

缺点:麻烦?每次更新的时候,都要先比对版本号,然后可能需要重新加载数据,再次修改,然后再写;这个过程可能重复好几次。


_version 元数据


PUT /test_index/test_type/6{  "test_field": "test test"}
# 201 success{ "_index" : "test_index", "_type" : "test_type", "_id" : "6", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "_seq_no" : 5, "_primary_term" : 1}
复制代码


Elasticsearch 第一次创建一个 document 的时候,它的_version 内部版本号就是 1;以后,每次对这个 document 执行修改或者删除操作,都会对这个_version 版本号自动加 1;哪怕是删除,也会对这条数据的版本号加 1


DELETE test_index/test_type/6
# 200 success
{ "_index" : "test_index", "_type" : "test_type", "_id" : "6", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "_seq_no" : 6, "_primary_term" : 1}
GET test_index/test_type/6
{ "_index" : "test_index", "_type" : "test_type", "_id" : "6", "found" : false}
POST test_index/test_type/6{ "test_field": "deleted 6"}
{ "_index" : "test_index", "_type" : "test_type", "_id" : "6", "_version" : 3, "result" : "created", "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "_seq_no" : 9, "_primary_term" : 1}
复制代码


们会发现,在删除一个 document 之后,可以从一个侧面证明,它不是立即物理删除掉的,因为它的一些版本号等信息还是保留着的。先删除一条 document,再重新创建这条 document,其实会在 delete version 基础之上,再把 version 号加 1

参考资料


optimistic concurrency control


发布于: 2021 年 01 月 23 日阅读数: 27
用户头像

escray

关注

Let's Go 2017.11.19 加入

在学 Elasticsearch 的项目经理

评论

发布
暂无评论
Elasticsearch Document 的 _version 元数据