我入库了一只笔,数量为30只,员工1和员工2在同时选择了这条入库信息准备进行出库,然后员工1进行出库操作,这条入库信息的数量就变为了0,然后笔的库存-30,之后因为员工2已经在页面上选好了这条信息,所以她可以继续进行出库,这条入库信息数量变为-30,笔的库存又被减了30,有什么方法可以解决这种问题吗?我想到使用乐观锁解决,但是不行,因为不在同一线程中version改了也没用,第二次出库获取的是修改后的version,所以第二次出库还是正确的
5条回答 默认 最新
- Winson.J 2021-11-02 15:16关注
乐观锁,可以解决这个问题,不在一个线程,不在一个服务器都可以
- 查询当前记录,这一步获取的重要信息,库存量和版本号,和Id(主键,)
- 检查库存是否足够出库
- 如果够继续,不够,就出库失败
- 执行更新语句:update 表 set 库存 = 原库存 - 出库, version = version +1 where id= xxx and version = xxx
查询条件除了主键以外还要带上步骤1查出来的版本号,更新时,除了库存,还要升个版本号 - 如果更新到记录(update 语句返回1),就正常出库,没更新到(update语句返回0)就出库失败
其他步骤都是常规,重点在第四步
如果第四步,有其他线程执行过同样的更新语句,那么这时候数据库里的版本号,和我们自己的在步骤1查出来的版本号
已经不一样(库里的加1了),所以我们的第四步是更新不到记录的,这时候就应该出库失败
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 wireshark抓不到vlan
- ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
- ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
- ¥15 stata安慰剂检验作图但是真实值不出现在图上
- ¥15 c程序不知道为什么得不到结果
- ¥40 复杂的限制性的商函数处理
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来