第一步:创建测试表 test,如下:

CREATE TABLE `test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`now` datetime DEFAULT NULL COMMENT '时间',`year_month` binary(7) DEFAULT '\0\0\0\0\0\0\0',`stock` mediumint(11) unsigned NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

模拟前提条件:
MySQL版本:5.7.26
事务级别:REPEATABLE-READ

第二步:模拟用户A制单、审核

START TRANSACTION;
select `stock`,`now` from test where id = 1 lock in share mode;
UPDATE test SET `stock` = `stock`-50,`now`=NOW() where id = 1;
COMMIT;

第三步:模拟用户B制单、审核

START TRANSACTION;
SELECT `stock`,`now` from test where id = 1 lock in share mode;
UPDATE test SET `stock`=`stock` - 60,`now`=NOW() WHERE id = 1;
COMMIT;

审单失败的原因分析
1.以测试的MySQL版本为例,事务的默认超时为:120秒,实际测试过程种发现,若采用默认的120秒超时机制,用户B的事务在用户A的锁超时后,会得以执行成功,通常用户B的事务被阻塞90秒左右,此时用户A的锁已经过期解除,因此用户B的事务可以正常执行,也就是说:用户A先执行扣减库存-50,但是因为某种原因没有commit,此时用户B也执行扣减库存,因为此时处于加锁状态,用户B的事务扣减库存会被阻塞,这个阻塞大概会持续90秒左右(这个阻塞时长依据实际情况会略有不同),用户A的锁过期被解除,这个时候用户B的事务得以正常执行成功并commit,此时实际库存是:stock - 60,即:100 - 60 = 40

###用户A经过长时间的搁置,已经制单,但是没有及时审核单据,过了很久,比如:迟疑超过了事务wait_timeout的半天,更甚者,第二天才来审核这个单据
2.用户A点击审单操作,这张单据是在用户B制单之前产生的,用户A要审核的单据内容是:stock - 50,即:100 - 50 = 50,然而实际情况是:用户B已经扣减库存-60,当前实际库存stock = 40,在执行用户A的第二步审核单据时,系统取得实际stock = 40,40 - 50 = -10,执行 update 失败,接着界面会提示库存不足

应对方案:
1.设置合理的事务超时:SET innodb_lock_wait_timeout=30; -- 默认的是 31536000秒
建议设置在 30 - 60 之间比较合理,假设超时为:30秒,那么用户B扣减库存时阻塞30秒,此时用户A加锁还在有效期内,用户B
2.提示信息优化:不要简单的提示 库存不足,这样用户会产生疑惑,以用户A为例:当他看到提示库存不足,他会想:这张单制单内容显示:库存100,扣减库存50,库存结余50,库存是足够扣减的,为什么会提示库存不足?
建议优化措施:库存不足时要提示出库存不足的原因,比如:库存不足,当前库存:40,待扣减50,最好还可以带出关联单据的查询,可以很直观的看出问题出在了哪里

分析ERP审单失败,提示:库存不足的原因及应对方案相关推荐

  1. ji计算机内存不足怎么回事,Win7提示内存不足的原因及应对措施

    用户在使用电脑的过程中难免会遇上一些问题.有用户反应在使用Win7系统的过程中,遇到系统提示:计算机的内存不足,如要还原足够的内存以使程序正确工作,请保存文件,然后关闭或重新启动所有打开的程序.用户不 ...

  2. 生产类库存管理的难点和应对方案

    库存管理是企业生产经营过程中重要的管理要素,科学的库存管理不仅能够提高企业的盈利能力,更能有效控制成本,实现资源的优化配置,反之则会让企业出现大规模的资源冗余和成本浪费,长此以往自然会降低企业的实际收 ...

  3. ERP物料采购系统需求分析与效果展示 ERP实施以失败告终的四个原因分析

    三年前给客户做的一个物料采购系统,客户因为价格问题搁置,今天把它拿出来分享,以分析改善方法. 项目名称: Item Purchasing System /Item Purchasing Request ...

  4. [ERP]呆滞库存产生的原因是什么?该如何预防?

    ​库存是什么?有人说,库存是危机:也有人说,库存是商机. 那么,究竟孰是孰非? 两种库存 其实,两种说法都没错,库存有两种. 一种叫 安全库存,是为了缓冲需求.计划.生产和供应波动的主动式备库,目的是 ...

  5. android tmp目录权限不够,/tmp目录下执行脚本失败提示Permission denied

    Linux上执行Shell脚本运行失败提示Permission denied一个问题,挺好的问题,切中了知识盲点. 问题现象 Shell脚本在/tmp目录下,执行./test.sh运行失败,提示Per ...

  6. 校企联合学院分析ERP在家具行业中的应用

    家具行业是离散式制造,但从管理流程上讲,实木家具和板式家具是有区别的.软体家具和金属家具也是有区别的.就算是同类型家具企业,其生产管理方式也有很大差异.很多家具企业管理混乱,生产管理的原因占了大约90 ...

  7. 分析appstore审核失败的真实案例及解决办法

    分析AppStore审核失败的真实案例及解决办法 App中设计的图标与Apple原生图标类似,Apple原生图标有专利保护,并且在Design Guideline里面规定,App的图标不能与Apple ...

  8. 配置计算机失败 备份,win10系统备份失败提示0x80070422的设置技巧

    win10系统使用久了,好多网友反馈说win10系统备份失败提示0x80070422的问题,非常不方便.有什么办法可以永久解决win10系统备份失败提示0x80070422的问题,面对win10系统备 ...

  9. Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 #原因...

    Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 "&#原因:接口响应数据中有&# 转载于:https://www. ...

最新文章

  1. console js刷新页面_Console.js使用说明
  2. 作图像处理时常用的C/C++语句积累!
  3. csharp: Aspose.Words create table
  4. 异步请求积压可视化|如何 1 分钟内快速定位函数计算积压问题
  5. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态
  6. mysql获取一列数据_mysql返回最后一列数据
  7. 实验8 SQL Server 的存储过程
  8. python3.5学习笔记:linux6.4 安装python3 pip setuptools
  9. leetcode - 486. 预测赢家
  10. ipython 模块搜索路径
  11. 生活中的实验 —— 家庭电路
  12. 历久而新,我的新书《第二行代码》已出版!
  13. 桥接模式与Nat模式的区别
  14. 网红茶饮难逃“短命”之殇,喜茶能否打破这个魔咒?
  15. 我们如何造红色敞篷跑车
  16. Python Java 滑块识别-通杀滑块
  17. autocad2014点击保存闪退_windows10下AutoCAD 2014打开出现闪退怎么办
  18. css伪类炫酷迷幻边框
  19. 《Long Short-Term Memory》翻译,Sepp Hochreiter, ¨urgen Schmidhuber.1997,9(8):1735-1780
  20. 笔记-项目沟通管理-沟通方法和方式

热门文章

  1. 解读redis的配置文件--redis.conf
  2. win8 网络 连接计算机名称,成熟的解决方案:Win8系统计算机的解决方案无法连接到WiFi无线网络...
  3. ios 高德地图加载瓦片地图_iOS高德地图添加自定义瓦片地图
  4. 爬虫之机器图像识别(ORC库)
  5. python如何使用tessract_Python如何基于Tesseract实现识别文字功能
  6. uniapp入门学习
  7. 编译参数-Wl和rpath的理解
  8. 阿里云配置小程序证书 https总结
  9. 微信读书项目记录(1)
  10. [作业]英语作业,无聊记事