zoukankan      html  css  js  c++  java
  • elasticsearch文档冲突

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/optimistic-concurrency-control.html
    当我们之前讨论 index , GET 和 delete 请求时,我们指出每个文档都有一个 _version (版本)号,当文档被修改时版本号递增。 Elasticsearch 使用这个 _version 号来确保变更以正确顺序得到执行。如果旧版本的文档在新版本之后到达,它可以被简单的忽略。
    我们可以利用 _version 号来确保 应用中相互冲突的变更不会导致数据丢失。我们通过指定想要修改文档的 version 号来达到这个目的。 如果该版本不是当前版本号,我们的请求将会失败。
    让我们创建一个新的博客文章:

    PUT /website/blog/1/_create
    {
      "title": "My first blog entry",
      "text":  "Just trying this out..."
    }

    现在,当我们尝试通过重建文档的索引来保存修改,我们指定 version 为我们的修改会被应用的版本:

    PUT /website/blog/1?version=1 
    {
      "title": "My first blog entry",
      "text":  "Starting to get the hang of this..."
    }

    我们想这个在我们索引中的文档只有现在的 _version 为 1 时,本次更新才能成功。

    此请求成功,并且响应体告诉我们 _version 已经递增到 2。
    然而,如果我们重新运行相同的索引请求,仍然指定 version=1 , Elasticsearch 返回 409 ConflictHTTP 响应码,和一个如下所示的响应体:

    {
       "error": {
          "root_cause": [
             {
                "type": "version_conflict_engine_exception",
                "reason": "[blog][1]: version conflict, current [2], provided [1]",
                "index": "website",
                "shard": "3"
             }
          ],
          "type": "version_conflict_engine_exception",
          "reason": "[blog][1]: version conflict, current [2], provided [1]",
          "index": "website",
          "shard": "3"
       },
       "status": 409
    }

    这告诉我们在 Elasticsearch 中这个文档的当前 _version 号是 2 ,但我们指定的更新版本号为 1 。

    我们现在怎么做取决于我们的应用需求。我们可以告诉用户说其他人已经修改了文档,并且在再次保存之前检查这些修改内容。 或者,在之前的商品 stock_count 场景,我们可以获取到最新的文档并尝试重新应用这些修改。
    所有文档的更新或删除 API,都可以接受 version 参数,这允许你在代码中使用乐观的并发控制,这是一种明智的做法。

  • 相关阅读:
    junit基础学习之-多线程测试(6)
    junit基础学习之-参数初始化(5)
    junit基础学习之-junit3和4的区别(4)
    junit基础学习之-断言注解(3)
    junit基础学习之-测试service层(3)
    java 实例 货币格式
    java md5 数据加密
    java 选择一个类,返回该实例对象
    java 输出为2的倍数的方法
    java 实例 设计一个方法,计算一个数的n次幂
  • 原文地址:https://www.cnblogs.com/gavinYang/p/11199793.html
Copyright © 2011-2022 走看看