elastic 部分更新 retry_on_conflict 和 数据库写锁 详细比对
1 数据库的 update 在修改这条数据的的过程中(这个过程指的是 数据库执行update 到 事务提交的过程中 )为这条数据加上 写锁,阻止 别的事务 对锁定数据的修改,请求后一个修改事务的线程阻塞,直到前一个事务的完成,所以针对这条数据的 2 个修改 是一个一个来的。所以 数据库的 update t1 set a = a+1; 这样的操作 不会导致 a数据的 丢失,因为前一个事务 执行的时候回阻塞后一个事务提交数据。 但是 如果先查询出a=1, 然后 a = 1(这个1 是查询到的 a)+1 ;这样的操作会 丢失 a ,因为 a 两个事务查询的a 可能 会被修改了。
2, es 的 全部修改,如果没有带上 version的 时候,直接替换原来的 文档,没有查询的过程。多线程操作,不区分执行的先后顺序。 但是带上version的时候 version 表示先后顺序。先执行成功的为主,后来的不合法被舍弃(抛出异常)。
3, es 部分修改的时候,修改请求到达 es 的 时候,es会在内部查询 一下原理的文档,然后执行 ,部分更新,注意一下,这时候 是 es 并不阻止 别的线程修改 这条数据,可能这个es 内部的查询 同是有多个( 这个阶段叫做 retrieve ),检索完成 记录一下 这是的 version, 和传过来的新的数据一起生成新的文档,然后把旧的文档改成假删除(这个过程叫做 reindex),这时候会修改 set version=version and version = version,如果另一个 线程做着同样的操作并且慢了 一点点,重建 索引这步 就会出异常。这时候 es会 重 复检索和 重构索引的过程 知道 正常完成 或者 重试次数大于 retry_on_conflict 抛出异常。
es 会吧 原理的就文档
总结:数据库 拒绝 第二个事务来修改 已经被修改但是未被提交的数据(事务未提交)。 es 的全更新 不会有自动检索 的过程,直接替换,可以通过version 控制并发。部分更新有自动检索的过程 ,并发修改冲突会重新检索,带上version然后重新新构建索引
重试 retry_on_conflict 次后会抛出异常,并且 也可以通过 version 控制(retry_on_conflict 默认0 次 相当于 自动带上了version,但是不完成等价 , 因为 version 读的 时机 不同,有些情况可能 不同的结果,主要肯写法 和 业务 情景 比如 a = a+1 就没影响,但是 a = 1+1 就有影响,可以细细体会 一下,挺有意思的 )。
elastic 部分更新 retry_on_conflict 和 数据库写锁 详细比对的更多相关文章
- sqlite数据库操作详细介绍 增删改查,游标
sqlite数据库操作详细介绍 增删改查,游标 本文来源于www.ifyao.com禁止转载!www.ifyao.com Source code package com.example ...
- 转载文章:Windows Azure 七月份更新:SQL 数据库、流量管理器、自动伸缩、虚拟机
转载文章:Windows Azure 七月份更新:SQL 数据库.流量管理器.自动伸缩.虚拟机 今天上午,我们发布了一些重大的 Windows Azure 更新.这些新的增强功能包括: · SQL 数 ...
- JDBC连接sql server数据库的详细步骤和代码
JDBC连接sql server数据库的详细步骤和代码 JDBC连接sql server数据库的步骤如下: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Ja ...
- svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录
svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录 Windows下,svn服务器IP本来是内网一台服务器上 ...
- python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类
自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...
- 使用EF Model First创建edmx模型,数据库有数据的情况下,如何同时更新模型和数据库
使用"EF Model First",我们可以很直观地在edmx文件中创建数据模型,并根据模型生成数据库,整个过程快速而高效.可当数据库中有了一定的数据量,同时,可能需要对模型中字 ...
- 咏南中间件更新日志--将数据库配置独立成DBCONFIG.EXE
咏南中间件更新日志--将数据库配置独立成DBCONFIG.EXE.
- Capistrano:自动完成多台服务器上新版本的同步更新,包括数据库的改变
https://baike.baidu.com/item/Capistrano/6844928?fr=aladdin Capistrano是一种在多台服务器上运行脚本的开源工具,它主要用于部署we ...
- JDBC连接sql server数据库的详细步骤和代码 转
JDBC连接sql server数据库的步骤如下: 1.加载JDBC驱动程序(只做一次): 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.C ...
随机推荐
- jetty域证书更新
服务器:centos6.6 1.从正确的.pfx文件中导出.pem认证文件 #openssl pkcs12 -in example.pfx -nodes -out server.pem pfx文件可以 ...
- Python中常见字符串去除空格的方法总结
Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...
- Maven Speed Up
收录架构 proxy代理仓库 不支持仓库搜索功能 收录版本 所有版本 更新时间 每24小时更新一次 使用说明 一.在maven软件中使用 以Maven 3.5.2为例: 打开maven配置文件 ./a ...
- Day9作业及默写
1,整理函数相关知识点,写博客. 2,写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def func(obj): return obj[1::2] 3, ...
- scrapy中自动补全url
url = "https:" + url 或者url = response.urljoin(url) #这里代表的是自动补全url
- winform 异性窗体的实现
效果图 首先需要在vs里添加控件 AlphaForm.dll 添加完了有这来两个控件 1.把第二个控件拖入窗体里把窗体铺满 2.找一张至少有一个闭合图形的透明图片 设置为AlphaFormTrans ...
- Python 数据共享
import time from multiprocessing import Process,Manager,Lock # a = 10 # # tmp = a # # tmp -= 1 # # a ...
- windows环境下安装Anaconda(Python)
参考网址:http://www.jianshu.com/p/169403f7e40chttp://blog.csdn.net/qq_26898461/article/details/51488326 ...
- ss linux终端配置
最近ss莫名宕机,懒得重新安装了,就安装了一个非gui版本,安装非gui版本还有一个优点就是在远程服务器的时候可以用proxychains进行终端代理,非常友好实用.下面简单的说一下如何进行终端ss ...
- input标签(文本域和文件域)
单行文本域: <form> <input type="text" name="..." ....../> </form> 属 ...