Elasticsearch 乐观锁处理

来源:互联网 发布:miss淘宝店网址 编辑:程序博客网 时间:2024/05/22 17:34

项目中想使用es作为数据存储,又要保证数据在并发更新下的一致性,查了es的资料,简单归纳下。

一 es的版本version
1.es创建或更新时,会维护一条document版本号;示例:
使用prepareIndex增加一条记录,默认version=1,再执行一次prepareIndex,发现version=2,依次累加。
这里写图片描述
2.使用prepareUpdate局部更新一条,version+1这里写图片描述
ES的index:如果没有创建,如果有记录,就覆盖
ES的update:update=query+delete+index三个步骤,原子操作

二 使用es的version保证并发更新一致性
1.创建时如果有记录就报异常,避免被覆盖。使用 IndexRequest.OpType.CREATE,异常:DocumentAlreadyExistsException
这里写图片描述
2.使用es的version局部更新,当前线程持有version,通过compare and swap 比较更新;当且传入version和es中version一样,才能更新。异常:VersionConflictEngineException
这里写图片描述

3.使用外部系统版本,setVersionType(VersionType.EXTERNAL),由于es不支持外部系统版本做update,所以用index覆盖
使用setVersionType(VersionType.EXTERNAL),就可以用比es系统中大的version去更新。可以用业务时间戳去设置version
注意:使用index是覆盖,覆盖前保证source正确完整。
这里写图片描述

原创粉丝点击