小白菜S 2023-12-20 14:57 采纳率: 85.7%
浏览 6
已结题

mysql 抢购超卖问题,执行sql是否可以预防

mysql 产品超卖
请问按以下sql 执行是否可以防止超卖?目前自己压测1000未发现问题

UPDATE product SET stock= (stock - 1 ) WHERE id = 1 and stock >= 1;

  • 写回答

1条回答 默认 最新

  • 小孟多 2023-12-20 15:03
    关注

    你的 SQL 语句可以在一定程度上防止超卖,但它并不是绝对可靠的解决方案。这是因为该语句仅在更新库存时检查当前库存是否大于等于 1,如果在多个并发事务中同时执行该语句,可能会导致超卖。
    为了更可靠地防止超卖,你可以考虑使用以下几种方法:
    1在事务中执行更新操作:使用 MySQL 的事务来确保库存更新的一致性。你可以将更新库存的操作包裹在一个事务中,这样如果某个更新失败,整个事务将被回滚,确保库存不会被超卖。
    2使用锁机制:在更新库存之前,你可以使用 MySQL 的锁机制来锁定相关的行或表。这样可以确保在某个事务更新库存时,其他事务无法同时进行更新,从而避免超卖。
    3使用乐观锁:乐观锁是一种在读取数据时获取版本号或时间戳的方法。在更新库存时,你可以检查版本号或时间戳是否与读取时相同。如果相同,你可以执行更新操作;如果不同,说明其他事务已经修改了数据,你可以采取适当的措施(如重试或返回错误)。
    4使用分布式锁或队列:如果你的应用涉及到多个节点或数据库,可以考虑使用分布式锁或队列来协调库存更新操作,确保只有一个节点或进程可以进行库存更新。
    综上所述,虽然你的 SQL 语句可以在一定程度上防止超卖,但为了确保可靠性,建议结合使用事务、锁机制或其他更高级的方法来处理库存更新操作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 创建了问题 12月20日

悬赏问题

  • ¥15 有人会SIRIUS 5.8.0这个软件吗
  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题
  • ¥15 MS中不知道高分子的构型怎么构建模型