elasticsearch学习笔记(十二)——Elasticsearch并发冲突问题以及锁机制

一、Elasticsearch并发冲突问题

对于通常的ES操做流程是:
一、先get document数据,好比获取到商品数据,将数据显示到网页上,同时在内存中缓存该documentd的数据
二、当网页发生了购买后,直接基于内存中的数据,进行计算和操做
三、将计算后的结果写回ES中缓存

下面描述一下场景
好比在电商场景下,假设说,咱们有一个程序,工做流程以下:
一、读取商品的信息
二、用户下单购买
三、更新商品信息(主要是将库存减1)
咱们假设程序是多线程的,因此说可能有多个线程并发的去执行上述的3个步骤流程多线程

将上述场景具体到某个商品的库存修改的时候,假设一个牙膏的库存是100件,如今同时有两我的都过来读取了牙膏的数据,而后下单购买了这管牙膏,此时两个线程并发执行,同时在进行商品库存的修改。并发

图片描述

如图所示,在正常的状况下,咱们指望线程A将库存-1,设置为99件;而后线程B接着这个99件,将库存-1,变为98件,而后写入到ES中。
可是总有一个线程是先到的,假设就是线程A,此时线程A就会先将牙膏的库存设置为99件,而后线程B再次将牙膏的库存设置为99件,结果很显然就不是咱们想要的。spa

上述的这个流程,其实就是ES中的并发冲突问题,会致使数据不许确。线程

二、悲观锁与乐观锁两种并发控制方案

这里先附上中华石衫老师画的手工图
图片描述blog

下面简单作一下描述和归纳
悲观锁:所谓悲观锁就是在任何状况下都上锁,上锁以后,就只有一个线程能够操做这一条数据,其它线程只能等待,固然在不一样的场景下,上的锁会有所不一样,能够是行级锁,表级锁,读锁,写锁。通俗的来说,加了悲观锁的话,对数据操做的时候就至关因而单线程的了。
乐观锁:其实所谓的乐观锁,根本就没有加锁,只是多了一标识字段,这个字段能够是一个整数类型的,也能够是时间类型的。主要的做用就是在每次修改数据的时候会作一层判断,判断数据是否已经被修改过了,若是已经被修改了,那么就会从新获取数据,在修改,这个过程不断进行知道数据修改为功。图片

下面比较一下两种锁的优缺点
一、对于悲观锁,它使用起来很方便,直接加锁就能够了,对于应用程序来讲,它是透明的,不须要作额外的操做。可是每次都须要获取到锁以后才能对数据进行修改,也就是同一时间只能有一个线程可以进行操做,并发能力很低
二、对于乐观锁,它根本就没有加锁,因此并发能力很高。可是每次更新数据的时候都须要对标识字段作一个判断,这个过程可能要重复不少遍。并且是须要应用程序作处理的。内存

三、Elasticseach基于_version进行乐观锁的并发控制

对于ES来讲,它是采用乐观锁,对应的乐观锁的标识字段是_version,是一个整数类型,一开始建立document时,_version是等于1的,以后对document每修改一次,_version版本号就会自动加1。get

相关文章
相关标签/搜索