ES权威指南[官方文档学习笔记]-36 dealing with conflicts

es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/version-control.html

下一篇:http://my.oschina.net/qiangzigege/blog/264346

内容:

当使用index API来更新文档时,我们读取原始文档,做出修改,重新索引整个文档,一口气完成。

最后一次的索引请求胜出,如果某人之前做出了文档改变,它的改变将会丢失。

通常,这不是一个问题,也许我们的主数据存储时一个关系型数据库,我们只是把数据复制到了ES来让它可以搜索,
也许基本不可能有两个人同一时间改变了同一个文档,或者文档改变的丢失对业务来说无关紧要。

但是,有的时候,丢失改变非常关键,想象一下,我们正在使用es来存储在线商店里的库存的物品数量,
每次我们卖出了一个,我们减少数量。

有一天,管理者决定卖,突然,我们每秒钟卖出一些物品,想象两个web进程,同时运行,都在处理同一个物品。
图7:没有并发控制的结果。

web_1做出的数量改变已经丢失,因为web_2不知道它的数据失效了,
结果就是:我认为我们有更多的物品,实际上不然,这会让客户失望。
操作越频繁,或者读和更新操作之间的时长越大,丢失越会发生。

有两种方法来保证并发的正确性。

悲观并发控制策略:
作为已经被关系型数据库广泛使用的策略,假设冲突很容易发生,
锁住相关资源来预防竞争,典型的例子就是:在读数据之前,锁住一行,保证当前线程可以做出改变。

乐观并发控制策略
这是es使用的策略,假设冲突不太可能发生,不阻止操作。
尽管如此,如果在读和写之间,数据已经改变,更新将会失败。
这得由应用自己决定如何解决这个问题,比如:
可以使用新的数据重新更新,或者报告失败给用户。


 

你可能感兴趣的:(elasticsearch)