zoukankan      html  css  js  c++  java
  • 25.partial update内置乐观锁并发控制

    主要知识点

       

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

    2retry_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冲突,在这种情况下,就可以用以下语法:

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

    retry策略:

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

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

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

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

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

       

       

  • 相关阅读:
    Spring Security简介与入门Demo
    电商项目之多功能增删改查案例
    linux-用户管理
    zabbix3.4配置第三方邮件报警
    zabbix3.4配置客户端配置
    centos7上安装zabbix3.4的详细步骤与问题处理记录
    MyBatis日记(五):一对一关系,一对多关系
    MyBatis日记(四):MyBatis——insert、update、delete、select
    Python日记(二):Python之禅
    Python日记(一):拜见小主——Python
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8463662.html
Copyright © 2011-2022 走看看