ElasticSearch内部基于_version乐观锁控制机制
1、悲观锁与乐观锁机制
为控制并发问题,我们通常采用锁机制。分为悲观锁和乐观锁两种机制。
悲观锁:很悲观,所有情况都上锁。此时只有一个线程可以操作数据。具体例子为数据库中的行级锁、表级锁、读锁、写锁等。
特点:优点是方便,直接加锁,对程序透明。缺点是效率低,并发能力非常弱。
文章图片
乐观锁:很乐观,对数据本身不加锁。提交数据时,通过一种机制验证是否存在冲突,如es中通过版本号验证。
特点:优点是并发能力高。缺点是操作繁琐,在提交数据时,高并发的情况下,可能反复重试多次。
文章图片
2、内部基于_version乐观锁控制
es对于文档的增删改都是基于版本号。
第一次执行
PUT /test_index/_doc/4 { "test_field": "test" }
【ElasticSearch内部基于_version乐观锁控制机制】此时可以版本号为1
文章图片
在执行一次:
文章图片
此时版本号已变为2,且result的值也为update
在执行删除文档操作
DELETE /test_index/_doc/4
文章图片
版本号变为3,result的值为deleted
再执行一次新增语句,注意这里要和前一条删除语句间隔时间不要太长,最好立即执行。
PUT /test_index/_doc/3 { "test_field": "test" }
可以看到版本号依然递增,并且验证成功延迟删除策略。
文章图片
因为如果删除一条数据立马删除的话,所有分片和副本都要立马删除,对es集群压力太大。
3、图解es内部并发控制
文章图片
es内部主从同步时,是多线程异步。采用乐观锁机制。
推荐阅读
- 分布式|基于Docker搭建 ELK分布式日志管理解决方案
- FaE(基于符号知识的适应性和可解释的神经记忆)
- 小项目集合|基于C语言扫雷游戏的设计与实现
- GeoServer-REST应用(基于Qt网络编程一键同步发布空间数据和样式至GeoServer)
- PHP 基于 SW-X 框架,搭建RPC微服务支持
- 基于OpenCV与JVM实现矩阵处理图像
- spring|spring IOC容器管理必须知道的一些操作(基于XML方式)
- 浏览器动态显示服务器日志,基于 websocket 实现远程实时日志 在浏览器中查看设备的运行日志...
- elasticsearch|使用docker安装elasticsearch和kibana
- 基于Lumisoft.NET组件,使用IMAP协议收取邮件