Elastic 并发更新问题

原创
2015/07/31 17:44
阅读数 1.5K


当并发更新时会有更新冲突,见下面的演示

#!/bin/bash
#clear first
curl -XDELETE 'localhost:9200/test-concurrent-update?pretty'

curl -XPOST 'localhost:9200/test-concurrent-update/type/1?pretty' -d '
{
  "count": 0
}'

#并发执行
for ((i=0; i<10; i++))
do
curl -XPOST 'localhost:9200/test-concurrent-update/type/1/_update?pretty' -d '{
    "script" : "ctx._source.count += 1"
}' &
done

wait
#check result
echo "check final result"
# why must have to sleep some time or cannot query any result ?
sleep 1
curl -XPOST 'localhost:9200/test-concurrent-update/type/_search?pretty' -d '
{
  "query":{"match_all": {}}
}'

执行上述脚本

$ bash  test_concurrent_update 
{
  "acknowledged" : true
}
{
  "_index" : "test-concurrent-update",
  "_type" : "type",
  "_id" : "1",
  "_version" : 1,
  "created" : true
}
{
  "_index" : "test-concurrent-update",
  "_type" : "type",
  "_id" : "1",
  "_version" : 2
}
{
  "error" : "VersionConflictEngineException[[test-concurrent-update][2] [type][1]: version conflict, current [2], provided [1]]",
  "status" : 409
}
{
  "error" : "VersionConflictEngineException[[test-concurrent-update][2] [type][1]: version conflict, current [2], provided [1]]",
  "status" : 409
}
{
  "error" : "VersionConflictEngineException[[test-concurrent-update][2] [type][1]: version conflict, current [2], provided [1]]",
  "status" : 409
}
{
  "error" : "VersionConflictEngineException[[test-concurrent-update][2] [type][1]: version conflict, current [3], provided [2]]",
  "status" : 409
}
{
  "error" : "VersionConflictEngineException[[test-concurrent-update][2] [type][1]: version conflict, current [3], provided [2]]",
  "status" : 409
}
{
  "_index" : "test-concurrent-update",
  "_type" : "type",
  "_id" : "1",
  "_version" : 3
}
{
  "_index" : "test-concurrent-update",
  "_type" : "type",
  "_id" : "1",
  "_version" : 4
}
{
  "error" : "VersionConflictEngineException[[test-concurrent-update][2] [type][1]: version conflict, current [4], provided [2]]",
  "status" : 409
}
{
  "error" : "VersionConflictEngineException[[test-concurrent-update][2] [type][1]: version conflict, current [4], provided [3]]",
  "status" : 409
}
check final result
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "test-concurrent-update",
      "_type" : "type",
      "_id" : "1",
      "_score" : 1.0,
      "_source":{"count":3}
    } ]
  }
}

期待count最终为10,但实际为3.其他的更新操作均因冲突导致更新失败。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
1 收藏
分享
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部