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正确完整。