weixin_438003299 2019-08-15 20:18 采纳率: 66.7%
浏览 672
已采纳

数据库行锁和乐观锁疑问

数据库中进行update.delete.insert操作会自动加上行锁,为什么还需要用乐观锁来解决高并发?来自小白的疑问.

  • 写回答

4条回答 默认 最新

  • 珍妮玛•黛金 博客专家认证 2019-08-15 22:58
    关注

    在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就无法执行,进行回滚了,这样就解决了高并发场景下防止超卖的情况

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥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时遇到的编译问题