3:基于乐观锁(两种)控制并发: version、external锁

ES是基于乐观锁进行并发控制的。

如果有并发的业务场景,可以直接使用ES内置乐观锁机制

使用的时候,java程序需要先Get指定的记录,获取到版本号,然后Put的时候,带着该版本号,请求更新。

ES只有判断到 该记录的 version = 请求中的version值 时,才能进行更新。如果不相等,则舍弃。

下面演示如何使用乐观锁:

1、 先创建一条记录,此时ES返回信息中会有标识: version=1

PUT  /test_index/test_type/1

{

"f1":"test f1"

}

2、带着version=1执行Put更新,能更新成功

PUT /test_index/test_type/1?version=1

{

"f1":"test Client 2"

}

3、另一个客户端也在同时做了Get查询,得到version=1,此时它带着version=1执行put时,会报错:version不一致。即使大于也不行

PUT /test_index/test_type/1?version=1

{

"f1":"test Client 3"

}

4、出现这种情况后,java程序应再次Get一次,得到新的版本号

GET  /test_index/test_type/1

5、 再发起一次请求,带着刚得到的版本号。此时能更新成功

PUT /test_index/test_type/1?version=2

{

"f1":"test Client 3"

}

-----------------------------------------------------External 锁------------------------------------------------------------------------------------------

1. 使用external锁的时候,ES判断,只要请求的version值 > 实际记录的version值,即可更新。等于的话,更新失败

PUT /test_index/test_type/2

{

"f1":"test f1"

}

PUT /test_index/test_type/2?version=2&version_type=external

{

"f1":"test f2"

}

原文地址:https://www.cnblogs.com/cc299/p/11032799.html

时间: 2024-08-29 06:11:26

3:基于乐观锁(两种)控制并发: version、external锁的相关文章

JavaScript强化教程——DOM编程(两种控制div移动的方法)

本文为H5EDU机构官方HTML5培训教程,主要介绍:JavaScript强化教程--DOM编程(两种控制div移动的方法) 第一种 按钮控制首先 创建两个html按钮和一个div并给div一个样式 input type="button" value="左" id="1"> <input type="button" value="右" id="2"> <div i

集群环境中使用Redis实现分布式锁两种方式

一.介绍 互联网的应用场景中,为了支持高并发的请求,服务都是执行的分布式部署,相同的任务可以在集群中不同的服务器上执行,并且现在的服务容器都是支持多线程,相同的任务也可能会被同一个容器多次执行,都要求执行结果都满足幂等性的设计原则. 分布式锁,就是为了确保在分布式的环境下,相同任务只会执行成功的执行一次,后续的执行不会对这些已经产生了变化的业务再次产生影响. 分布式锁的实现有不少的方式,如: 使用RDBMS数据库本身的表锁或行锁特性: 使用Redis做为分布式锁: 使用Zookeeper做为分布

spark基于yarn的两种提交模式

一.spark的三种提交模式 1.第一种,Spark内核架构,即standalone模式,基于Spark自己的Master-Worker集群. 2.第二种,基于YARN的yarn-cluster模式. 3.第三种,基于YARN的yarn-client模式. 如果,你要切换到第二种和第三种模式,在提交spark应用程序的spark-submit脚本加上--master参数,设置为yarn-cluster,或yarn-client,即可.如果没设置,那么,就是standalone模式. 一.基于YA

Populating Next Right Pointers in Each Node II [leetcode] 空间O(1)的基于循环和基于递归的两种方法

基于循环的方法: void connect(TreeLinkNode *root) { if (root == NULL) return; TreeLinkNode * start = root; TreeLinkNode * end = root; TreeLinkNode * levelEnd = root; while (start != NULL) { if (start->left != NULL) { end->next = start->left; end = end-&g

通过锁字符串达到控制并发的效果C#

lock锁的是地址 而.net有内部机制使得相同的字符串内存地址是相同的(new string)除外 下面上实验代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp5 { class Program { static void

ElasticSearch 并发冲突+悲观锁与乐观锁+基于_version和external version进行乐观锁并发控制

1.图解剖析Elasticsearch并发冲突问题 2.图解剖析悲观锁与乐观锁两种并发控制方案 3.图解Elasticsearch内部如何基于_version进行乐观锁并发控制 (1)_version元数据 PUT /test_index/test_type/6{ "test_field": "test test"} { "_index": "test_index", "_type": "test

SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

 下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表     user表:  account表:  然后创建实体类        **第一种通过创建子类的方式查询                             需求:查询所有的用户基础信息以及其所属的账户中的金额     1.创建想要得到多表查询数据的实体类(子类)            

数据库两大神器【索引和锁】

前言 只有光头才能变强 索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的. 本文力求简单讲清每个知识点,希望大家看完能有所收获 声明:如果没有说明具体的数据库和存储引擎,默认指的是MySQL中的InnoDB存储引擎 一.索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度 表经常进行INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入.删除.修改等维护任务的速度. 索引需要占物理和数据空间. 了解过索引的最左匹配原则 知道索引

Letter Combinations of a Phone Number [leetcode]谈谈循环解法的两种思路

本系列博文中有很多两种思路的,其实是因为第一遍刷题的时候有一个想法,第二遍刷题的时候已经忘掉之前的思路了,又有新的想法了. 同时大部分代码我也同时PO到leetcode的对应题目的问答中去了,所以如果你也查看问题讨论的话会发现有和我一模一样的代码,其实就是我PO的:) 书接正文,基于循环的两种思路如下: 第一种思路 比如"234"这个字符串,我可以先将0...1的所有排列找到-->{"a", "b", "c"} 再进一步

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

本文参考: http://mysqlpub.com/thread-5383-1-1.html http://blog.csdn.net/c466254931/article/details/53463596 有很多是转载合并过来. 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重