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

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

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

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

可以在update之前做个查询,符合数量就更改,不符合就返回

你说的这种version也能解决大部分问题,每次改库存的时候至少得前置判断库存够不够,修改时where条件得加上 version=version

出库接口,你拿到数据首先得判断数量够不够出库,然后再进行出库或者错误提醒。这个没有什么优雅不优雅的,就是需要这么写啊。
但是高并发也会出现问题,两个线程同时取数,同时走判断逻辑,同时出库。
需要用到同步锁或者分布式锁。

加入分布式锁