数据库中进行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就无法执行,进行回滚了,这样就解决了高并发场景下防止超卖的情况本回答被题主选为最佳回答 , 对您是否有帮助呢?评论 打赏 举报解决 4无用