主要知识点

基于external version进行乐观锁并发控制

es提供了一个feature,就是说,你可以不用它提供的内部_version版本号来进行并发控制,可以基于你自己维护的一个版本号来进行并发控制。举个列子,假如你的数据在mysql里也有一份,然后你的应用系统本身就维护了一个版本号,无论是什么自己生成的,程序控制的。这个时候,你进行乐观锁并发控制的时候,可能并不是想要用es内部的_version来进行控制,而是用你自己维护的那个version来进行控制。

内部版本号的用法:?version=1

外部版本号的用法: ?version=1&version_type=external

version_type=external和内部版本号控制唯一的区别在于,当使用内部_version时,只有当你提供的version与es中的_version一模一样的时候,才可以进行修改,如果不一样则会报错;当version_type=external的时候,只有当你提供的version比es中的_version大的时候,才能完成修改,其他情况则报错。

例如:在es中,_version=1,?version=1,才能更新成功

在es中,_version=1,?version>1&version_type=external,才能成功,比如当?version=2&version_type=external时才能修改成功

用法举例

1、先构造一条数据

PUT /test_index/test_type/8

{

"test_field": "test"

}

结果如下:

{

"_index": "test_index",

"_type": "test_type",

"_id": "8",

"_version": 1,

"result": "created",

"_shards": {

"total": 2,

"successful": 1,

"failed": 0

},

"created": true

}

2、模拟两个客户端同时查询到这条数据(在浏览器中新开一个网页就行)

GET /test_index/test_type/8

结果如下:

{

"_index": "test_index",

"_type": "test_type",

"_id": "8",

"_version": 1,

"found": true,

"_source": {

"test_field": "test"

}

}

3、第一个客户端先进行修改

此时客户端程序是在自己的数据库中获取到了这条数据的最新版本号,比如说是2

PUT /test_index/test_type/8?version=2&version_type=external

{

"test_field": "test client 1"

}

执行结果如下:

{

"_index": "test_index",

"_type": "test_type",

"_id": "8",

"_version": 2,

"result": "updated",

"_shards": {

"total": 2,

"successful": 1,

"failed": 0

},

"created": false

}

4、模拟第二个客户端进行修改

第二个客户端同时拿到了自己数据库中维护的那个版本号也是2,同时基于version=2发起修改

PUT /test_index/test_type/8?version=2&version_type=external

{

"test_field": "test client 2"

}

结果如下,可以看到修改不成功,原因是客户端1进行了修改,此时版本号就是2,发起修改时的版本号不大于2,所以修改不成功。

{

"error": {

"root_cause": [

{

"type": "version_conflict_engine_exception",

"reason": "[test_type][8]: version conflict, current version [2] is higher or equal to the one provided [2]",

"index_uuid": "6m0G7yx7R1KECWWGnfH1sw",

"shard": "1",

"index": "test_index"

}

],

"type": "version_conflict_engine_exception",

"reason": "[test_type][8]: version conflict, current version [2] is higher or equal to the one provided [2]",

"index_uuid": "6m0G7yx7R1KECWWGnfH1sw",

"shard": "1",

"index": "test_index"

},

"status": 409

}

5、在并发控制成功后,重新基于最新的版本号发起更新

(1)先用GET得到最新的版本号

GET /test_index/test_type/8

结果如下:得到 "_version": 2,

{

"_index": "test_index",

"_type": "test_type",

"_id": "8",

"_version": 2,

"found": true,

"_source": {

"test_field": "test client 1"

}

}

(2)再在"_version": 2的基础上进行更新,这一次version=3

PUT /test_index/test_type/8?version=3&version_type=external

{

"test_field": "test client 2"

}

结果如下:可以看出更新成功

{

"_index": "test_index",

"_type": "test_type",

"_id": "8",

"_version": 3,

"result": "updated",

"_shards": {

"total": 2,

"successful": 1,

"failed": 0

},

"created": false

}

22.external version的更多相关文章

  1. Elasticsearch由浅入深(五)_version乐观锁、external version乐观锁、partial update、groovy脚本实现partial update

    基于_version进行乐观锁并发控制 先构造一条数据出来 PUT /test_index/test_type/ { "test_field": "test test&q ...

  2. 基于external version进行乐观锁并发控制

    ?version=1?version=1&version_type=external它们的唯一区别在于,_version,只有当你提供的version与es中的_version一模一样的时候, ...

  3. 在Spring(4.3.22)中集成Hibernate(5.4.0)

    (1)pom中添加相关依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibe ...

  4. 说一下集成 diagram-viewer 的心路历程 5.22.0

    1. 下载部署包文件地址:https://github.com/Activiti/Activiti/releases/download/activiti-5.22.0/activiti-5.22.0. ...

  5. Activiti 5.22 spring

    <!-- activiti依赖 --> <dependency> <groupId>org.activiti</groupId> <artifac ...

  6. ElasticSearch(九)基于version进行乐观锁并发控制

    一.基于version进行乐观锁并发控制 1).查看一条document GET /test_version/test_version_type/ { "_index" : &qu ...

  7. 22 Maven高级应用

    1.Maven基础知识回顾 maven是一个项目管理工具.依赖管理:maven对项目中的jar包的管理过程.传统的工程我们直接将jar包放置到项目中. maven工程真正的jar包放置在仓库中,项目中 ...

  8. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project gulimall-common: There are test failures.

    对Maven打包时碰见的问题: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (d ...

  9. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

随机推荐

  1. Top10Servlet

    <span style="font-size:18px;">/** * Top10 * author:杨鑫 */ package servlet; import jav ...

  2. wpf 样式的调用

    这个针对异地调用: 1.在主程序的项目中新建一个Skins的目录.然后再目录里新建一个BlackSkin.xaml的字典资源: <ResourceDictionary xmlns="h ...

  3. js原生offsetParent解析

    offsetParent是个仅仅读属性,返回近期显示指定位置的容器元素的引用. 假设元素没有指定位置,近期的元素或者根元素(标准模式下是html,怪异模式下是body)就是offsetParent. ...

  4. poj和hdu部分基础算法分类及难度排序

    最近想从头开始刷点基础些的题,正好有个网站有关于各大oj的题目分类(http://www.pythontip.com/acm/problemCategory),所以写了点脚本把hdu和poj的一些题目 ...

  5. 【Nginx】模块化设计

    高度模块化的设计是Nginx的架构基础.全部模块都是以ngx_module_t结构体表示,该结构体内部定义了7个回调方法.它们负责模块的初始化和退出.commands成员是一个包括有ngx_comma ...

  6. java 将byte[]转为各种进制的字符串

    public void test() { byte[] bytes = new byte[10000000]; for (int i = 0; i < 10000000; i++) { if ( ...

  7. B4321 queue2 dp

    这个题的dp真的恶心.首先,一开始我以为是一道数论题,但是组合数和这个题没啥关系.dp方程巨麻烦,状态是dp[i][j][0/1],代表i位连了j个,上一位是否连着.然后开始转移,证明如下: 我们先来 ...

  8. B1816 扑克牌 二分答案 + 贪心

    这个题我一开始想到了二分答案,但是去写了另一个算法,用优先队列直接模拟,最后GG了...因为我没考虑每个套牌只能有一个joker...尴尬. 后来二分答案,然后暴力验证就行了. 题干: Descrip ...

  9. Java中继承,类的高级概念的知识点

    1. 继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2. 继承的优点 A.代码的可重用性 B.子类可以扩 ...

  10. Moco模拟服务器实现请求&响应 (一)

    接口测试Moco工具 1.使用Moco模拟,首先需要下载Moco 的jar 包,下载链接: http://central.maven.org/maven2/com/github/dreamhead/m ...