首页/数据/NoSQL 速查/_seq_no 与 _primary_term 乐观并发控制
本包目录(322 条)
MongoDB99 条
Elasticsearch89 条
ClickHouse56 条时序与列式28 条选型与架构50 条

_seq_no 与 _primary_term 乐观并发控制

文档的 _seq_no 随每次写入递增、_primary_term 标识主分片任期;写入或更新时带上 if_seq_no 与 if_primary_term,可避免覆盖别人刚写的版本。

NoSQL 速查数据更新于 2026-10-12
读取GET /<index>/_doc/<id> 响应里带 _seq_no 与 _primary_term
条件写PUT 或 _update 加 ?if_seq_no=N&if_primary_term=M
冲突结果版本不匹配返回 409 version_conflict_engine_exception

示例

示例
GET /my-index/_doc/1

PUT /my-index/_doc/1?if_seq_no=5&if_primary_term=2
{ "title": "updated with conflict check" }

# 部分更新也支持
POST /my-index/_update/1?if_seq_no=6&if_primary_term=2
{ "doc": { "views": 15 } }
这是乐观锁:先读到版本号再提交,提交时校验;失败的一方重读重试,而不是先锁住文档。

易错点

  • 重试逻辑若直接复用旧版本号会一直失败,每次重试都要重新 GET 最新版本
  • 并发写入同一文档仍可能互相覆盖,串行化要求高时应在业务层合并写或改用外部锁

数据来源与参考

  • Elasticsearch Guide: Optimistic concurrency control
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌