SQL处理并发之乐观锁
来源:互联网 发布:淘宝开店审核要多久 编辑:程序博客网 时间:2024/06/07 06:55
问题描述
在使用mysql数据库存储数据的前提下,有一个抢任务系统,一个任务只能分配给n个人,如果有高并发请求,如何保证数据完整性?
一般做法
在不考虑到数据是否完整的情况下,我们一般只会按照以下思维开发:
- 用户请求抢任务接口
- 读取数据库剩余数量
- 如果大于0,剩余数量减1,更新数据库剩余数量(update task set count=count-1 where id=‘任务id’)
- 返回数据
出现的问题以及使用乐观锁概念解决
为什么上面的做法不对呢?我们举个例子,假设用户1和用户2同时调用请求抢任务接口,并且数据库只剩下一个任务可抢,任务剩余数量使用count字段保存;
用户1和用户2请求接口情况模拟,表格的每一行表示一个时间点
通过以上的问题,我们不难知道,本来只有一个任务可抢的,现在被两个用户同时抢了,而且数据库还出现了-1的情况,而这种情况再高并发的时候经常会遇到。
要解决高并发带来的问题,就可以利用乐观锁的概念来解决。
将上面中的第3个步骤中是sql语句改为(update task set count=count-1 where id=1 and count=1)
当然,其中的count=1中的1是步骤2读取出来的数据总数。
或者可以给表加一个版本号version字段,默认为1,每次执行更新的时候自增1,并在where语句后带上读取到的版本号,以免再读取和更新数据之间,有第三者更新了数据库。
最后结果
- 用户请求抢任务接口
- 读取数据库剩余数量
- 如果大于0,剩余数量减1,更新数据库剩余数量(update task set count=count-1 where id=‘任务id’ and count=‘读取到的剩余数量’)
- 返回数据
0 0
- SQL处理并发之乐观锁
- 乐观锁(处理并发)
- Nosql Mongodb 并发控制之乐观锁
- Nosql Mongodb 并发控制之乐观锁
- 乐观锁和悲观锁 对多并发处理
- 并发乐观锁
- 并发与乐观锁
- Java并发编程 之 乐观锁和悲观锁
- ElasticSearch并发操作之乐观锁的使用
- ElasticSearch并发操作之乐观锁的使用
- 并发控制乐观锁Version
- Elasticsearch 并发修改乐观锁
- Elasticsearch 并发修改乐观锁
- ElasticSearch并发修改乐观锁
- 乐观锁解决高并发
- Elasticsearch 乐观锁处理
- Entity Framework 4.1 之六:乐观并发
- Entity Framework 4.1 之六:乐观并发
- C++第二次作业
- Oracle中查看所有表和字段(转载)
- 时间转换成毫秒
- magento缓存系列详解:clean cache
- 人眼特性
- SQL处理并发之乐观锁
- 小程序上拉下拉共存时不可使用scroll-view的解决方法
- 单例模式
- Linux虚拟机配置固定IP地址
- Android studio T-MVP模式
- php各个版本下载网址
- JAVA对象jackson序列化json属性名变成小写的解决方案
- java常量类的一种定义方式
- Ununtu12.04 安装openJdk1.7