1、悲观锁与乐观锁机制

为控制并发问题,我们通常采用锁机制。分为悲观锁和乐观锁两种机制。

悲观锁:很悲观,所有情况都上锁。此时只有一个线程可以操作数据。具体例子为数据库中的行级锁、表级锁、读锁、写锁等。

特点:优点是方便,直接加锁,对程序透明。缺点是效率低,并发能力非常弱。

  

乐观锁:很乐观,对数据本身不加锁。提交数据时,通过一种机制验证是否存在冲突,如es中通过版本号验证。

特点:优点是并发能力高。缺点是操作繁琐,在提交数据时,高并发的情况下,可能反复重试多次。

  

2、内部基于_version乐观锁控制

es对于文档的增删改都是基于版本号。

第一次执行

PUT /test_index/_doc/4
{
"test_field": "test"
}

此时可以版本号为1

  

在执行一次:

  

此时版本号已变为2,且result的值也为update

在执行删除文档操作

DELETE /test_index/_doc/4

  

版本号变为3,result的值为deleted

再执行一次新增语句,注意这里要和前一条删除语句间隔时间不要太长,最好立即执行。

PUT /test_index/_doc/3
{
"test_field": "test"
}

可以看到版本号依然递增,并且验证成功延迟删除策略。

  

因为如果删除一条数据立马删除的话,所有分片和副本都要立马删除,对es集群压力太大。

3、图解es内部并发控制

  

es内部主从同步时,是多线程异步。采用乐观锁机制。

最新文章

  1. windows下编译及使用libevent
  2. 自定义AlertDialog的样式
  3. RabbitMQ、Rdis
  4. Sharepoint更新字段触发工作流(无代码)
  5. css样式兼容不同浏览器问题解决办法
  6. OpenJudge/Poj 1004 Financial Management
  7. C++实现base64编码(1)
  8. JS indexOf() lastIndexOf()与substring()截取字符串的区别
  9. JS中typeof与instanceof的区别 (2010-05-26 10:47:40
  10. sql差异
  11. 在ASP.NET CORE 2.0使用SignalR技术
  12. 个人 git-hub使用方法
  13. 项目中Java Resources有红叉,其它没有,解决办法
  14. GO入门——7. 并发
  15. nfs 提高传输速度
  16. cmd怎么删除Oracle数据库中的用户实例
  17. JAVA的CLASS文件详解
  18. vim简单的配置
  19. ES6 set 应用场景
  20. SSH免密登录配置

热门文章

  1. STC8H开发(八): NRF24L01无线传输音频(对讲机原型)
  2. JavaScript之Promise实现原理(手写简易版本 MPromise)
  3. AT5760 Manga Market
  4. Collection和Map集合
  5. IntelliJ IDEA 学习笔记 - 修改编码
  6. bom-倒计时
  7. Function.prototype.bind、call与apply
  8. 使用ajax上传文件
  9. java篇之JDBC原理和使用方法
  10. 利用脚本快速执行Dockerfile以及docker镜像的启停与删除