库存扣减的流水账记录问题
2015-07-10 16:16
501 查看
场景描述:
商品都有库存数,每卖出N件,就会将库存减N。系统在这个过程做了两件事情:
1,扣库存前,先将该商品的当前库存数从“商品库存表”中查出来,记录流水账信息到“库存扣减流水表”中,包括该商品的当前库存、扣减数量、扣减后的库存。
2,扣减库存,更新库存表的商品库存数。
问题描述:
在单线程下没有问题,但是在多线程并发卖同一个商品的时候,出现了问题:
存库表的存库是正确的,也是就是说现有系统的隔离级别,防止了在多线程下扣减库存错误();但是记录库存扣减流水信息时, 出现了两个线程的读取到的当前库存数一样,期望的结果是:当前线程读取到的库存数必须是上一个线程扣减库存后的库存。
问题分析:
库存是当前线程,读取到内存中的,依次记录流水,扣减存库。所以当前线程必须等到上个线程事务提交后,扣减库存更新到数据库后,才能去库存表中查出库存数。
解决方案:
在查询库存的SQL语句后增加for update,锁定当前记录;后来的线程,执行该语句时,将处于阻塞状态,只有等待前面的线程事务提交后,后来的线程的查询语句才会有返回结果。这时返回的库存已是最新的库存。
商品都有库存数,每卖出N件,就会将库存减N。系统在这个过程做了两件事情:
1,扣库存前,先将该商品的当前库存数从“商品库存表”中查出来,记录流水账信息到“库存扣减流水表”中,包括该商品的当前库存、扣减数量、扣减后的库存。
2,扣减库存,更新库存表的商品库存数。
问题描述:
在单线程下没有问题,但是在多线程并发卖同一个商品的时候,出现了问题:
存库表的存库是正确的,也是就是说现有系统的隔离级别,防止了在多线程下扣减库存错误();但是记录库存扣减流水信息时, 出现了两个线程的读取到的当前库存数一样,期望的结果是:当前线程读取到的库存数必须是上一个线程扣减库存后的库存。
问题分析:
库存是当前线程,读取到内存中的,依次记录流水,扣减存库。所以当前线程必须等到上个线程事务提交后,扣减库存更新到数据库后,才能去库存表中查出库存数。
解决方案:
在查询库存的SQL语句后增加for update,锁定当前记录;后来的线程,执行该语句时,将处于阻塞状态,只有等待前面的线程事务提交后,后来的线程的查询语句才会有返回结果。这时返回的库存已是最新的库存。
相关文章推荐
- CSS3的颜色透明度 ajax请求时loading
- .Net学习笔记----2015-07-10(基础复习和练习09)
- 明月千里:酒店里的艺术之旅
- iOS开发-UITableView-3(左右滑动)
- javascript重置Radio单选按钮
- Struts2(四)---NETctoss资费列表
- KMP算法详解
- LeetCode :: Validate Binary Search Tree[具体分析]
- EL与JSTL
- Calendar 中getActualMaximumd 功能
- Linux 环境变量PATH设置
- 关于android中PendingIntent.getBroadcase的注册广播
- [良心推荐] 红杏公益版 hx.gy
- 【技术支持】Oracle plsql中的having子句并非都能改写成where子句。having子句的适用场景。
- 明月千里集团拓展农村市场加油站分析
- TCP连接建立过程中为什么需要“三次握手”
- Java 7中的TransferQueue
- CoCreateInstanceEx函数使用
- Spring3+Mybatis3+Mysql+ivy+liquibase 集成
- typedef函数指针