🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 悲观锁和乐观锁 * 悲观锁: 假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 * 乐观锁: 假设不会发生并发冲突,只是在提交操作时检查是否违反数据完整性,看到的数据不是实时的,脏读 内部版本控制和外部版本控制 * 内部版本控制: `_version`自增长,修改数据后,`_version`会自动加1 * 外部版本控制: 为了保持 `_version` 与外部版本控制的数值一致,使用 `version_type=external` ,检查数据当前的version值是否小于请求中的version值,一些关系型数据库使用时间戳当做版本控制,他把查询交给es,希望es也能使用这个版本控制 # 内部版本控制 我们来保存个数据 ~~~ PUT /library/book/1 { "title": "es", "price": "3" } ~~~ 保存完,结果显示 ![](https://img.kancloud.cn/d5/49/d54931be9d608a8b56f71415284a4ce2_401x233.png) 查询下 ~~~ GET /library/book/1 ~~~ 更改当前版本,比如当前版本是3 ~~~ POST /library/book/1/_update?version=3 { "doc": { "price": 15 } } ~~~ 更改完版本号加1 查询下 ~~~ GET /library/book/1 ~~~ # 外部版本控制 ~~~ POST /library/book/1?version=100&version_type=external { "doc": { "price": 20 } } ~~~ 意思就是请求,你带过去的version值要大于内部的version值就可以