ES 支持乐观锁吗?如何实现的?
典型回答 支持,Elasticsearch 支持通过使用文档版本控制来实现乐观锁。(https://www.elastic.co/guide/en/elasticsearch/reference/current/optimistic-concurrency-control.html ) 在 ES 中,每个文档存储时都有一个 _version 字段,这个版本号在每次文档更新时自动增加。当我们执行更新、删除或者使用脚本处理文档时,可以指定这个版本号来确保正在操作的文档是预期中的版本。如果操作中的版本号与存储在索引中的文档版本号不一致,说明文档已被其他操作更改,当前操作将会失败。(CAS) 但是,从Elasticsearch 6.7 版本开始,使用 _version 关键字进行乐观锁已经被废弃了,替代方法是使用 if_seq_no 和 if_primary_term 来指定版本。 假设有一个文档: 1 2 3 4 5 6 7 8 9 10 { "_index": "products", "_type": "_doc", "_id": "1", "_version": 10, "_source": { "name": "Coffee", "price": 20 } } 基于他,我们可以在更新时进行乐观锁控制,避免发生并发修改: 1 2 3 4 5 POST /products/_doc/1?if_seq_no=312&if_primary_term=2 { "name": "Coffee", "price": 22 } 这里的 if_seq_no 和 if_primary_term 是 Elasticsearch 中的字段,用于管理乐观锁。如果文档自上次你读取以来没有被更改,if_seq_no 和 if_primary_term 会匹配,你的更改就会被应用。如果不匹配,更新操作会失败。 ...