version=1&version_type=external 和 if_seq_no=0&if_primary_term=1 之间的区别

Difference between version=1&version_type=external and if_seq_no=0&if_primary_term=1

基于这个,显然可以说:

但是作为用户,version=1&version_type=externalif_seq_no=0&if_primary_term=1在实现并发控制上有什么区别吗?

我的理解是:

这两个结论对吗?如果正确,具体为什么?


我在ES 7.4.2做了一些简单的实验如下:

POST test/_bulk
{"index": { "_id": 1 }}
{"test": 1}
{"index": { "_id": 2 }}
{"test": 2}

PUT test/_doc/1?version=1&version_type=external&error_trace=true 
{
  "test": 1
}

GET test/_doc/1

PUT test/_doc/1?if_seq_no=0&if_primary_term=1&error_trace=true 
{
  "test": 1
}

基于这个旧的postElasticsearch Versioning Support,我看到_version在ES中用于并发控制。

虽然在Breaking changes in 6.7,我可能只是在这里引用。

internal version may not uniquely identify a document’s version if an indexed document wasn’t fully replicated when a primary fails. As such it is unsafe to use for optimistic concurrency control, is deprecated and the option will no longer be available in Elasticsearch 7.0.0. Please use the if_seq_no and if_primary_term parameters instead.

所以基本上答案是:

  • 如果我们有外部版本控制系统,我们可以将它们都用作“外部”并发控制;
  • 虽然ES的“内部”并发控制,我们应该使用if_seq_no=0&if_primary_term=1作为唯一的选择。