开发者学堂课程【ElasticSearch 入门精讲:ES 版本控制】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/631/detail/9959
ES版本控制
普通关系型数据库使用的是(悲观并发控制(PCC))
当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据。
ES 使用的是(乐观并发控制(OCC))
ES 不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以市新读取新数据来进行更新
ES 如何实现版本控制(使用es内部版本号)
ES版本控制
1∶首先得到需要修改的文档,获取版本(version))号,也要定位到指定的版本号下面指定索引:
curl-XGET
http://localhost:9200/bigdata/product/1
2∶再执行更新操作的时候把更新版本号传过去
curl-XPUT http://localhost:9200/bigdata/product/1?version=1-d(参数)
{'f"name"∶"hodoop",version"∶3}(覆盖)操作
curl-XPOST http://localhost:9200/bigdata/product/1/update?version=3-d'doc":f"name":"apachehadoop","latest_version"∶2.6}(部分更新,是版本号之后,可以调剂再传过去)
如∶
jerry@JANSONO1 data]$ curl-H'Content-Type:application/json'-XPOST 'Http://ANSONO1:9200/bigdata/product/HM9rL2oB300nRXZV6BRB/update?version=2&pretty'-
}
“index":"bigdata),
_type":"product",
"_id*:"HM9rL2oB300nRXZV6BRB",
"_version":3,
"result";"updated",
·shards":{
“total":2, 。
"successful":1,
"failed":0
},
“seq no":6,
3∶如果传递的版本号和待更新的文档的版本号不一致,则会更新失败ES如何实现版本控制(使用外部版本号)
如果你的数据库已经存在了版本号,或者是可以代表版本的时间载。这时就可以在es 的产询 uril 后面添加 version_type=external 来使用这些号码。
注意∶版本号码必须要是大于0小于9223372036854775807(Java中long的最大正值)的整数。
ES 在处理外部版本号的时候,它不再检查 version 是否与请求中指定的数值是否相等,而是检查当前的 version 是否比指定的数值小,如果小,则请求成功。
example:
curl-XPUT'http://localhost:9200/bigdata/product/20?version=10&version type=external'-d'{"name":"flink")
注意∶此处 url 前后的引号不能省略,否则执行的时候会报错