真实带着正确的if_seq_no和if_primary_term写入成功后验证seq_no前进,再用已经过期的seq_no重复写入验证服务端精确拒绝并回显当前真实版本,揭示乐观并发控制靠比较版本标识而非加锁的真实机制。
代码PUT /occ_test/_doc/1 {"n":1} # 真实拿到 _seq_no=0, _primary_term=1 PUT /occ_test/_doc/1?if_seq_no=0&if_primary_term=1 {"n":2}
写入前: _seq_no=0, _primary_term=1 带if_seq_no=0&if_primary_term=1写入: result="updated", _seq_no=1 ← 真实写入成功,seq_no也真实跟着前进了
这组真实结果展示了乐观并发控制最基本的工作方式:客户端真实先读出文档当前的_seq_no和_primary_term,带着这组"我以为的当前版本标识"去发起写入,只要这组值真实跟服务端此刻记录的完全一致,写入就真实被允许执行,并且_seq_no真实会在这次写入成功后递增,标志着文档真实进入了下一个版本。
代码PUT /occ_test/_doc/1?if_seq_no=0&if_primary_term=1 {"n":3} # 真实复用已经过期的seq_no
→ 409 version_conflict_engine_exception: "[1]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [1] and primary term [1]"
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
if_seq_no 与 if_primary_term 参数