数据库中进行update.delete.insert操作会自动加上行锁,为什么还需要用乐观锁来解决高并发?来自小白的疑问.
4条回答 默认 最新
关注 在mysql InnoDB中,会对UPDATE、DELETE和INSERT语句自动加锁,以此来保障数据的一致性
但是在高并发场景下就有问题,举个例子有个商品表goods,剩余库存字段是stock
mysql> select * from goods;
| id | goods | stock |
| 1 | 手机 | 10 |
| 2 | 电脑 | 20 |A人员买了1个手机--》UPDATE goods SET stock = stock + 1 WHERE id = 1
B人员买了1个手机--》UPDATE goods SET stock = stock + 1 WHERE id = 1
。。。
如果有100个人同时去买这10个手机,就会出现超卖的情况,这显然是不符合常理的加入乐观锁之后的效果
mysql> select * from goods;
| id | goods | stock | lock |
| 1 | 手机 | 10 | 1 |
| 2 | 电脑 | 20 | 1 |A买手机之后的操作就是这样
先拿到锁:select lock from goods where id = 1 得到 lock = 1
然后再执行减库存,同时把锁 + 1
update goods set stock = stock - 1, version = version+1
where id = 1 and lock=#{这里就是刚刚拿到的那个锁lock = 1}这样即使100个人拿到的锁lock 都是1,那么第一个买手机的人成功的人就是把lock + 1 = 2,
那么剩下的99个人在执行update的时候就发现锁变成了lock = 2,而他们当时拿到的锁lock = 1,
这样锁就不一致了,update就无法执行,进行回滚了,这样就解决了高并发场景下防止超卖的情况本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 基于卷积神经网络的声纹识别
- ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
- ¥100 为什么这个恒流源电路不能恒流?
- ¥15 有偿求跨组件数据流路径图
- ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
- ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
- ¥15 CSAPPattacklab
- ¥15 一直显示正在等待HID—ISP
- ¥15 Python turtle 画图
- ¥15 stm32开发clion时遇到的编译问题