咕噜咕噜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 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来