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


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

     

     

    主要知识点:

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

    1、实验实战演练基于_version进行乐观锁并发控制

    (1)先构造一条数据出来

    PUT /test_index/test_type/7

    {

      "test_field": "test test"

    }

    (2)模拟两个客户端,都获取到了同一条数据

    GET test_index/test_type/7

    {

      "_index": "test_index",

      "_type": "test_type",

      "_id": "7",

      "_version": 1,

      "found": true,

      "_source": {

        "test_field": "test test"

      }

    }

    此时可以看出两个客户端所取得的数据的 _version都是等于1,

    (3)其中一个客户端,先更新这个数据

      更新数据的同时带上数据的版本号,确保此次更新的客户端中的数据的版本号和es中的数据的版本号相同,才能修改

    PUT /test_index/test_type/7?version=1

    {

      "test_field": "test client 1"

    }

    结果如下,可以看出此时的版本号变成2了。

    {

      "_index": "test_index",

      "_type": "test_type",

      "_id": "7",

      "_version": 2,

      "result": "updated",

      "_shards": {

        "total": 2,

        "successful": 1,

        "failed": 0

      },

      "created": false

    }

    (4)另外一个客户端基于原版本号进行修改

      因为他取数据时原数据的版本号是1,此次修改就尝试基于version=1的数据去进行修改,同样带上version版本号,进行乐观锁的并发控制

    PUT /test_index/test_type/7?version=1

    {

      "test_field": "test client 2"

    }

    结果如下,说明未修改成功,未成功的原因是版本号冲突

    {

      "error": {

        "root_cause": [

          {

            "type": "version_conflict_engine_exception",

            "reason": "[test_type][7]: version conflict, current version [2] is different than the one provided [1]",

            "index_uuid": "6m0G7yx7R1KECWWGnfH1sw",

            "shard": "3",

            "index": "test_index"

          }

        ],

        "type": "version_conflict_engine_exception",

        "reason": "[test_type][7]: version conflict, current version [2] is different than the one provided [1]",

        "index_uuid": "6m0G7yx7R1KECWWGnfH1sw",

        "shard": "3",

        "index": "test_index"

      },

      "status": 409

    }

    (5)在乐观锁成功阻止并发问题之后,尝试正确的完成更新

    1、先去取现在这份数据在es中的版本号

    GET /test_index/test_type/7

    {

      "_index": "test_index",

      "_type": "test_type",

      "_id": "7",

      "_version": 2,

      "found": true,

      "_source": {

        "test_field": "test client 1"

      }

    }

    2、然后基于最新的数据和版本号去进行修改

      修改时,带上最新的版本号,可能这个步骤会需要反复执行好几次,才能成功,特别是在多线程并发更新同一条数据很频繁的情况下

    PUT /test_index/test_type/7?version=2

    {

      "test_field": "test client 2"

    }

    {

      "_index": "test_index",

      "_type": "test_type",

      "_id": "7",

      "_version": 3,

      "result": "updated",

      "_shards": {

        "total": 2,

        "successful": 1,

        "failed": 0

      },

      "created": false

    }

    总结:

    es 进行修改等操作时,总是要先比对版本号,只有当版本号一致时才能修改,如果不一致就不能进行操作。

  • 相关阅读:
    jboss项目迁移至WebLogic12
    数据库字段关联更新
    清理ms sql server 大日志文件数据
    tool class
    pwn学习日记Day17 《程序员的自我修养》读书笔记
    pwn学习日记Day16 pwn原理理解
    pwn学习日记Day15 《程序员的自我修养》读书笔记
    pwn学习日记Day14 《程序员的自我修养》读书笔记
    pwn学习日记Day13 《程序员的自我修养》读书笔记
    pwn学习日记Day12 《程序员的自我修养》读书笔记
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8436616.html
Copyright © 2020-2023  润新知