Elasticsearch版本:6.0
为了避免并发修改的冲突问题,数据库中,经常用悲观锁和乐观锁来控制并发问题,而Elasticsearch使用乐观锁。如果源数据在读写过程中被修改,更新将失败,应用程序可以决定进行重试更新、使用新数据、把情况报告给用户等操作。
Elasticsearch的乐观锁实现原理
Elasticsearch是分布式的,文档创建、更新、删除时,新文档必须复制到集群的其他节点;
Elasticsearch是异步并发的,上述复制请求可以被并行的发送,到达目的地后是无序的;
为了保证Elasticsearch并发更新/删除时数据不会丢失,可以利用_version来实现乐观锁,就是说在修改文档时,指定文档的_version,如果该版本不是当前版本,请求将失败。
使用外部系统
使用其他数据库作为数据存储,而Elasticsearch做数据检索,数据库的变更都要复制到Elasticsearch,这个复制过程仍然会有并发问题,ES可以直接使用数据库的版本号,ES增加版本字段,用来和数据库的版本作比较,如果ES当前的版本号小于请求的版本号,则使用请求的版本号进行更新等操作。
使用全局锁、文档锁、数锁来解决并发问题