Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改

前言

并发控制,一般有两种方案,悲观锁和乐观锁,其中悲观锁是默认每次更新操作肯定会冲突,所以每次操作都要先获取锁,操作完毕再释放锁,适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突,所以在更新前和更新后都不需要获取锁和释放锁的操作,所以效率更高,适合于读多写少的场景中。

在es中采用的是乐观锁机制,这也很好理解,因为es的定位是一个搜索引擎,所以一般是应用于读多写少的场景中。

es的乐观锁机制

1. 每次更新文档的version都会+1(这种方式已废弃)
2. 内部版本号控制,通过if_seq_no+if_primary_term
3. 外部版本号控制,version+verion_type=exeternal,其中verison由外部数据源指定,如数据从MySQL同步

查询的时候展示:

更新后:

修改固定值报错:

代码

java 复制代码
 User user = new User();
            user.setAge(27);
            user.setName("赵六7");
            user.setInfo("测试人员查询");
            user.setSex("男");
            GetResponse<User> getResponse = elasticsearchClient.get(e -> e.index("user_test").id("3"), User.class);
            Long version = getResponse.version();
            Long seqNo = getResponse.seqNo();
            Long primaryTerm = getResponse.primaryTerm();
            System.out.println("更新前的version"+version+"更新前的seqNo"+seqNo+"更新前的primayTerm"+primaryTerm);
            // 修改带着版本号
            UpdateResponse<User> updateResponse = elasticsearchClient.update(e -> e.index("user_test").id("3").doc(user).ifSeqNo(seqNo).ifPrimaryTerm(primaryTerm), User.class);
            GetResponse<User> getResponse2 = elasticsearchClient.get(e -> e.index("user_test").id("3"), User.class);
            Long version2 = getResponse2.version();
            Long seqNo2 = getResponse2.seqNo();
            Long primaryTerm2 = getResponse2.primaryTerm();
            System.out.println("更新后的version"+version2+"更新后的seqNo"+seqNo2+"更新后的primayTerm"+primaryTerm2);
相关推荐
非优秀程序员3 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻4 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊6 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang7 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪7 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
用户956256254297 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
愿有所息7 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
威哥爱编程8 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
秋饼8 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
威哥爱编程8 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos