ES基于自身乐观锁进行并发控制
ES基于Document中的version字段进行并发控制,初始创建version为1
每次需要带上version进行更新,该步骤需要多次,特别是在多线程环境下
基于external version进行并发控制
ES提供了一个插件,可以不用它提供的version,可以基于自己维护的一个版本号进行控制, 详细语法
?version=1&version_type=external
这里需要关注两点
1.ES提供的version需要与ES中的version一摸一样的时候才可以进行修改
2.external version提供的version比ES中的version大的时候才可以进行修改
partial update 部分修改
释义:每次传递需要发生修改的Field,不需要将全量的document传递过去
语法如下
POST /index/type/id/_update
{
"doc" : {
"field":"val"
}
}
Partial Update内部原理和传统PUT方式内部原理是一样的,会将老的Document标记为deleted,然后创建一个新的Document。
Partial Update相较于全量替换的优点如下
1.所有的查询,修改和写入操作,都发生在ES中的一个shard 内部,避免了网络数据传输开销(减少两次网络请求),大大的提升了性能
2.减少了查询和修改的时间间隔,可以减少并发冲突的情况
Partial Update的并发控制
Retry策略,语法如下
POST /index/type/id?retry_on_confict=5
上面语法的意思是重新拿到版本号进行更新,最多重试五次