主要知识点

 
 

(1)partial update内置乐观锁并发控制

(2)retry_on_conflict

post /index/type/id/_update?retry_on_conflict=5&version=6

 
 

一、一般情况下partial update实现过程

用户直接修改field,然后发送给应用程序,由应用程序直接发送给ES,和全量替换相比,全量替换要先去es进行查找,把查找的数据返回给应用程序,然后再次返回给用户界面,只有这样用户才知道要替换什么,partial update少了先查找的这一步。在es内部,由es先把原来旧的数据查找出来(得到数据和_version值),partial update的数据更新到这份数据中(带着_version值),然后把原来旧的数据标记为deleted,把新的数据进行替换。由此可以看出,用户是用的partial update,但是在ES内部,仍然是全量替换。但是在替换过程中仍然遵循乐观锁的控制策略。

二、并发情况下partial update实现过程

线程1取得es中的一条数据,此时_version=1,取得这条数据时对他进行partial update,

在线程1取得es中的数据后,线程二也取得该数据,并对该数据进行了修改,并写回了es,此时es中该数据的_version=2,

当线程1把他取的数据进行修改后,重新写回es时,所带的_version =1 ,因为此时es中_version=2,所以修改不成功,es自动将该次partial update fail掉,也就是这种情况下线程一的修改被es自动忽略。es内部会自动执行乐观锁的并发控制策略。

三、当_verion冲突时的办法

线程一写回数据时产生_version冲突,在这种情况下,就可以用以下语法:

1、post /index/type/id/_update?retry_on_conflict=5

retry策略:

(1)
再次获取该document的数据和最新的版本号

(2)
基于最新的版本号再次去更新,如果成功就OK

(3) 如果不成功就再一次执行1和2的步骤,最多执行5次。

2、post /index/type/id/_update?retry_on_conflict=5&version=6

指定版本号,也就是说当这次更新成功后的版本号就是6

 
 

 
 

25.partial update内置乐观锁并发控制的更多相关文章

  1. Elasticsearch学习笔记(八)Elasticsearch的乐观锁并发控制

    一.基于_version的乐观锁并发控制                 语法:PUT /test_index/test_type/id?version=xxx             更新时带上数据 ...

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

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

  3. 21.实验基于_version进行乐观锁并发控制

    21.实验基于_version进行乐观锁并发控制 主要知识点: 实验基于_version进行乐观锁并发控制 1.实验实战演练基于_version进行乐观锁并发控制 (1)先构造一条数据出来 PUT / ...

  4. 6:Partial Update 内部原理 和 乐观锁并发控制

    Partial Update 内部执行过程: 首先,ES文档是不可变的,它们只能被修改,不能被替换.Update Api 也不例外. Update API 简单使用与之前描述相同的 检索-修改-重建索 ...

  5. Java多线程之syncrhoized内置互斥锁的用法详解

       转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827547.html    解决并行冲突最有效的方法就是加同步锁,主要有以下几种方法:   1:动态方法 ...

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

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

  7. 20.基于es内部_version进行乐观锁并发控制

  8. Elasticsearch技术解析与实战(七)Elasticsearch partial update

    普通的partial update 1.插入测试数据 PUT /test_index/test_type/10 { "test_field1": "test1" ...

  9. Elasticsearch学习笔记(九)partial update

    一.什么是partial update? PUT /index/type/id,创建文档&替换文档,就是一样的语法 一般对应到应用程序中,每次的执行流程基本是这样的: (1)应用程序先发起一个 ...

随机推荐

  1. Eclipse集成Resinserver

        因为Resin在Eclipse下的表现丝毫不亚于Tomcat,小编决定带领众小弟一起学习使用Resin.虽然小编身边也没有什么大牛在使用Resin,但看到Resin的广告已经吹到天边了.所以还 ...

  2. clCreateCommandQueue': was declared deprecated

    今天在配置opencl的开发环境.測试用例时,用的是intel的sdk开发包.遇到了这个问题: clCreateCommandQueue': was declared deprecated 也就是说这 ...

  3. C# datagridview 删除行(转 学会、放弃博客)

    原文引入:http://zhangyanyansy.blog.163.com/blog/static/13530509720106171252978/ datagridview 删除行 2010-07 ...

  4. python chunk 方式读取大文件——本质上还是file read自身支持

    参考:https://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python 最优雅方式: file ...

  5. 电脑升级win10后visio的问题

    上周由于电脑意外蓝屏,系统从win7升级到了win10,昨天工作写文档时才发现缺少画图的工具,于是按照了visio2013,在编辑设计图时发现,一旦用visio打开或编辑图后再到word里设计图的内容 ...

  6. C# List常识之经常被忽略的常识

    最近在接收前辈的代码,越来越会发现有很多.net已经封装好的方法可以使用,我们却不知道,然后自己去For/Foreach循环解决自己的需求问题 总的来说:当下很忧伤啊.总结了几个经常需要用却不知道的方 ...

  7. 后台传list,前台接受

    @RequestMapping("/page1") public ModelAndView editSharing(Integer id) { ModelAndView mav=n ...

  8. MYSQL 代码删除和添加表格列方法

    一个表格建立后用代码删除或添加列: -- 删除列alter table teacher drop column create_time;-- 添加列alter table teacher add co ...

  9. Linux系统下通过命令行对mysql数据进行备份和还原

    一.备份 1.进入mysql目录 cd /var/lib/mysql (进入mysql目录,根据安装情况会有差别) 2.备份 mysqldump -u root -p密码 数据库名 数据表名 > ...

  10. QtUI设计:设置控件透明

    QT设置按钮控件透明: 代码: //设置按钮 背景 前景 this->ui->ShowCvRGB->setStyleSheet(QString("color:rgba(25 ...