美文网首页
elasticsearch乐观锁

elasticsearch乐观锁

作者: 念䋛 | 来源:发表于2021-08-12 09:24 被阅读0次
    悲观锁和乐观锁

    1、悲观并发控制
    这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问
    资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放
    置锁的线程能够对这行数据进行修改。
    2、乐观并发控制
    Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在
    尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接
    下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关
    情况报告给用户。

    POST和PUT的介绍

    1.更新:PUT会将新的json值完全替换掉旧的;而POST方式只会更新相同字段的值,其他数据不会改变,新提交的字段若不存在则增加,原有字段如果在新提交的字段中没有,则字段会丢失,这里就要使用_update
    2.PUT和DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有什么不同,DELETE也是一样。
    3.POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建了若干的资源。
    4.创建操作可以使用POST,也可以使用PUT,区别就在于POST是作用在一个集合资源(/user)之上的,而PUT操作是作用在一个具体资源之上的(/user /123)。
    提到过POST和PUT新增字段在原有字段中没有,原有的字段就消失了_update可以单独更新某个数据.

    _seq_no和_primary_term介绍
    1. _version表示当前数据新的版本号;老版本使用
    2. _seq_no其实和version同一个道理,一旦数据发生更改,数据也一直是累计的;_seq_no是全局加一
    3. _primary_term表示是由谁分配的,意思说如果文档在一个集群里面,文档肯定会被分配一个位置,_primary_term表示的就是一个位置;
    PUT和POST在操作数据的时候_seq_no都会加1

    PUT操作

    PUT /my_doc/_doc/1
    {
    "id": 1,
    "name": "张三"
     }
    

    POST操作

    POST /my_doc/_doc/1
    {
    "id": 1,
    "name": "张三"
     }
    

    _seq_no都会加一

    {
      "_index" : "my_doc",
      "_type" : "_doc",
      "_id" : "1",
      "_version" : 40,
      "result" : "updated",
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no " : 39,
      "_primary_term" : 1
    }
    

    当POST结合_update使用的时候,如果值没有发生变化, _seq_no不会加一

    POST /my_doc/_update/1
     {
     "doc": {
     "name": "李四1"
     }
    

    使用乐观锁

    POST /my_doc/_update/1/?if_seq_no=1&if_primary_term=1
     {
     "doc": {
     "name": "张三"
     }
     }
    

    如果_seq_no与_primary_term当前文档不一致的时候

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "version_conflict_engine_exception",
            "reason" : "[1]: version conflict, required seqNo [1], primary term [1]. current document has seqNo [40] and primary term [1]",
            "index_uuid" : "pZXBlHMoSrG-s_ovuFGKtQ",
            "shard" : "0",
            "index" : "my_doc"
          }
        ],
        "type" : "version_conflict_engine_exception",
        "reason" : "[1]: version conflict, required seqNo [1], primary term [1]. current document has seqNo [40] and primary term [1]",
        "index_uuid" : "pZXBlHMoSrG-s_ovuFGKtQ",
        "shard" : "0",
        "index" : "my_doc"
      },
      "status" : 409
    }
    
    

    相关文章

      网友评论

          本文标题:elasticsearch乐观锁

          本文链接:https://www.haomeiwen.com/subject/ngbxbltx.html