锁:悲观 、乐观
基于version乐观锁,带着current version 执行修改,如果version不一样需要先获取新的version
全局锁:put /fs/lock/global/_create{} 会使系统并发能力很低
fs: 你要上锁的那个index
lock: 就是你指定的一个对这个index上全局锁的一个type
global: 就是你上的全局锁对应的这个doc的id
_create:强制必须是创建,如果/fs/lock/global这个doc已经存在,那么创建失败,报错
删除:DELETE /fs/lock/global
document锁:脚本上锁
POST /fs/lock/1/_update { "upsert": { "process_id": 123 }, "script": "if ( ctx._source.process_id != process_id ) { assert false }; ctx.op = 'noop';" "params": { "process_id": 123 依据 } } |
两个process_id相同,直接返回成功
不相同,这个doc之前已经被别人上锁了,失败、报错、重试、锁定成功
方式二:将脚本文件放到config/script目录下
scripts/judge-lock.groovy: if ( ctx._source.process_id != process_id ) { assert false }; ctx.op = 'noop'; POST /fs/lock/1/_update { "upsert": { "process_id": 123 }, "script": { "lang": "groovy", "file": "judge-lock", "params": { "process_id": 123 } } } |
释放:
POST /fs/_refresh delete /fs/lock/1
大批量删除 id=1的那个锁
Put /fs/lock/_bulk{"delete":{"_id":1}}
查询当前这个进程他上锁的有哪些文档
GET /fs/lock/_search?scroll=1m { "sort":["_doc"], "query": { "match": { "process_id": "123" } } } |
共享锁:读锁 可多个
judge-lock-2.groovy: if (ctx._source.lock_type == 'exclusive') { assert false }; ctx._source.lock_count++ |
|||
|
|||
解锁 POST /fs/lock/1/_update { "script": { "lang": "groovy", "file": "unlock-shared" } 每次解一个共享锁,对lock_count先减1,如果减了1之后,是0, } 都解锁完了,将/fs/lock/1删除,彻底解锁所有的共享锁 |
排他锁:写锁 只有一个不能读
PUT /fs/lock/1/_create { "lock_type": "exclusive" }create语法,要求lock必须不能存在,直接自己是第一个上锁的人 如果已经有人上了共享锁,明显/fs/lock/1是存在的,create语法去上排他锁,肯定会报错 解锁排他锁DELETE /fs/lock/1 |