25.partial update内置乐观锁并发控制
主要知识点
(1)partial update内置乐观锁并发控制
(2)retry_on_conflict
post /index/type/id/_update?retry_on_conflict=5&version=6
一、一般情况下partial update实现过程
用户直接修改field,然后发送给应用程序,由应用程序直接发送给ES,和全量替换相比,全量替换要先去es进行查找,把查找的数据返回给应用程序,然后再次返回给用户界面,只有这样用户才知道要替换什么,partial update少了先查找的这一步。在es内部,由es先把原来旧的数据查找出来(得到数据和_version值),partial update的数据更新到这份数据中(带着_version值),然后把原来旧的数据标记为deleted,把新的数据进行替换。由此可以看出,用户是用的partial update,但是在ES内部,仍然是全量替换。但是在替换过程中仍然遵循乐观锁的控制策略。
二、并发情况下partial update实现过程
线程1取得es中的一条数据,此时_version=1,取得这条数据时对他进行partial update,
在线程1取得es中的数据后,线程二也取得该数据,并对该数据进行了修改,并写回了es,此时es中该数据的_version=2,
当线程1把他取的数据进行修改后,重新写回es时,所带的_version =1 ,因为此时es中_version=2,所以修改不成功,es自动将该次partial update fail掉,也就是这种情况下线程一的修改被es自动忽略。es内部会自动执行乐观锁的并发控制策略。
三、当_verion冲突时的办法
线程一写回数据时产生_version冲突,在这种情况下,就可以用以下语法:
1、post /index/type/id/_update?retry_on_conflict=5
retry策略:
(1)
再次获取该document的数据和最新的版本号
(2)
基于最新的版本号再次去更新,如果成功就OK
(3) 如果不成功就再一次执行1和2的步骤,最多执行5次。
2、post /index/type/id/_update?retry_on_conflict=5&version=6
指定版本号,也就是说当这次更新成功后的版本号就是6
最新文章
- 三年回首:C基础
- iOS加密之MD5加密
- 帆软FineReport如何使用程序数据集
- C# 中excel操作
- android自定义view仿照MIUI中音量控制效果
- WordPress 4.0 “Benny” 正式发布
- POJ——3984
- TextView 实现复制文本功能
- Linux错误代码
- UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
- HDU1372:Knight Moves(经典BFS题)
- 使用IE滤镜实现css3中rgba让背景色透明的效果
- Android 之 Window、WindowManager 与窗口管理
- web.xml 的加载顺序
- Qt 打包发布 不能动态打开图片显示问题
- TCP/IP卷一:第一章
- 【BZOJ4033】【HAOI2015】树上染色
- STL字符串常用方法扩展
- REST-framework快速构建API--源码解析
- 限定某个目录禁止解析php 、限制user_agent 、php的配制文件、PHP的动态扩展模块
热门文章
- 迅为4412开发板Linux驱动教程/硬件知识及原理图的使用
- UVA 12683 Odd and Even Zeroes(数学—找规律)
- Swoole源代码学习记录(十二)——ReactorThread模块
- oracle强化练习之单行函数
- zoj2676 Network Wars(0-1分数规划,最大流模板)
- Oracle Instant Client 安装配置
- bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
- python 9:list.reverse()(倒置原列表,可恢复改变)
- c语言中struct的初始化
- 7.union