咕噜咕噜502 2021-11-02 14:43 采纳率: 57.7%
浏览 48
已结题

如何解决同一条入库信息被重复出库

我入库了一只笔,数量为30只,员工1和员工2在同时选择了这条入库信息准备进行出库,然后员工1进行出库操作,这条入库信息的数量就变为了0,然后笔的库存-30,之后因为员工2已经在页面上选好了这条信息,所以她可以继续进行出库,这条入库信息数量变为-30,笔的库存又被减了30,有什么方法可以解决这种问题吗?我想到使用乐观锁解决,但是不行,因为不在同一线程中version改了也没用,第二次出库获取的是修改后的version,所以第二次出库还是正确的

  • 写回答

5条回答 默认 最新

  • Winson.J 2021-11-02 15:16
    关注

    乐观锁,可以解决这个问题,不在一个线程,不在一个服务器都可以

    1. 查询当前记录,这一步获取的重要信息,库存量和版本号,和Id(主键,)
    2. 检查库存是否足够出库
    3. 如果够继续,不够,就出库失败
    4. 执行更新语句:update 表 set 库存 = 原库存 - 出库, version = version +1 where id= xxx and version = xxx
      查询条件除了主键以外还要带上步骤1查出来的版本号,更新时,除了库存,还要升个版本号
    5. 如果更新到记录(update 语句返回1),就正常出库,没更新到(update语句返回0)就出库失败
      其他步骤都是常规,重点在第四步
      如果第四步,有其他线程执行过同样的更新语句,那么这时候数据库里的版本号,和我们自己的在步骤1查出来的版本号
      已经不一样(库里的加1了),所以我们的第四步是更新不到记录的,这时候就应该出库失败
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月5日
  • 已采纳回答 11月5日
  • 创建了问题 11月2日

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行