ElasticSearch 根据_seq_no并发控制

本文介绍了如何利用ElasticSearch的_seq_no字段进行并发控制,以解决更新过程中的并发问题。通过在请求中指定if_seq_no和if_primary_term参数,确保在特定序列号和主项术语下才执行更新操作,防止数据冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结论

先查操作之前当前数据的_seq_no,_primary_term值比如各自是0和1
在更新的时候url带上if_seq_no=0&if_primary_term=1
指明只有在这个值的情况下才进行更新,否则返回错误

案例

 步骤1:测试数据添加
website/blog/1/_create
{
  "title": "My first blog entry",
  "text":  "Just trying this out..."
}
返回值会有一个_seq_no和_primary_term字段
"_seq_no": 0,
"_primary_term": 1

步骤2:并发控制
获取数据
website/blog/1
返回值
{
    "_index": "website",
    "_type": "blog",
    "_id": "1",
    "_version": 1,
    "_seq_no": 0, // 注意看这里
    "_primary_term": 1,// 注意看这里
    "found": true,
    "_source": {
        "title": "My first blog entry",
        "text": "Just trying this out..."
    }
}

步骤3:进行更新数据加上条件
website/blog/3?if_seq_no=0&if_primary_term=1
大概意思就是只有if_seq_no和if_primary_term等于我们的值的时候才进行更新
重复操作会报
{
    "error": {
        "root_cause": [
            {
                "type": "version_conflict_engine_exception",
                "reason": "[3]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [3] and primary term [1]",
                "index_uuid": "hqx20LnrTgiOykvXMLw-dQ",
                "shard": "0",
                "index": "website"
            }
        ],
        "type": "version_conflict_engine_exception",
        "reason": "[3]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [3] and primary term [1]",
        "index_uuid": "hqx20LnrTgiOykvXMLw-dQ",
        "shard": "0",
        "index": "website"
    },
    "status": 409
}

注意

对于es的修改都是无序的,可能会造成并发的一些问题。
这时我们在操作es的时候可以通过_seq_no这个es自带的字段进行控制
注意:一些老的版本es使用version,但是新版本不支持了,会报这个错误,提示我们用if_seq_no和if_primary_term

{
    "error": {
        "root_cause": [
            {
                "type": "action_request_validation_exception",
                "reason": "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
            }
        ],
        "type": "action_request_validation_exception",
        "reason": "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
    },
    "status": 400
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值