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
网友评论