Elasticsearch 乐观锁处理

项目中想使用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正确完整。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值