五十九、Elasticsearch数据建模--基于全局锁实现悲观锁并发控制

1、悲观锁有三种锁粒度
这里讲解的是最粗的一个粒度,全局锁。

2、如果多个线程都过来要修改数据

如果多个线程都需要修改mt_index/my_type下的title属性,实际上要进行并发的控制,避免出现多线程的并发安全问题,乐观锁可以用版本号去搞,这里讲解全局锁(悲观锁的最粗粒度)

3、全局锁是什么?
全局锁直接锁掉整个my_index

4、全局锁实验

PUT /my_index/lock/global/_create
{}

my_index:你要上锁的那个index
lock:就是你指定的一个对这个index上全局锁的一个type
global:就是你上的全局锁对应的这个doc的id
_create:强制必须是创建,如果my_index/lock/global已经存在那么创建失败,报错。

5、模拟多线程

再打开一个浏览器,进入kibana,执行

PUT /my_index/lock/global/_create
{}

结果

{
  "error": {
    "root_cause": [
      {
        "type": "version_conflict_engine_exception",
        "reason": "[lock][global]: version conflict, document already exists (current version [1])",
        "index_uuid": "dTq5iuE3R42azqsrCuN_UA",
        "shard": "2",
        "index": "my_index"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[lock][global]: version conflict, document already exists (current version [1])",
    "index_uuid": "dTq5iuE3R42azqsrCuN_UA",
    "shard": "2",
    "index": "my_index"
  },
  "status": 409
}

这时候进行update操作是可以的,因为我全局锁锁的是create

如果第一个浏览器删除锁
DELETE /my_index/lock/global
那么第二个浏览器在执行create操作也将畅通无阻。

5、全局锁的优点和缺点

优点:操作非常简单,非常容易使用,成本低
缺点:你直接就把整个index给上锁了,这个时候对index中所有的doc的操作,都会被block住,导致整个系统的并发能力很低

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg

你可能感兴趣的:(五十九、Elasticsearch数据建模--基于全局锁实现悲观锁并发控制)