产品库存负数问题!锁能解决吗?

编程有钱人了 2015-01-19 11:45:52
给一个学校的社团做的一个简单购物系统,有秒杀功能...开始没想到他们有那么多人同时抢商品
现在出现问题就是库存会出现负数问题...痛苦啊

declare @kc int;
select @kc=kcsl from H_Product where spid=10;
if(@kc>0)
update H_Product set kcsl =kcsl -1 where spid=10;
else
print '库存不足'
--购买成功一个库存减去一个
--但是实际情况 是当大很多人执行这个语句的时候 能出现负数...

我之前发过一个这样帖子,在.NET区 ,他们说这种情况要基于内存来处理了,保证变量的原子性

我想问问 如果纯用数据库能不能解决这个高并发的问题?解决库存负数的问题
...全文
594 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程有钱人了 2015-01-19
  • 打赏
  • 举报
回复
引用 2 楼 luckyrandom 的回复:
设计问题,简单处理就加个约束,库存数据必须>=0 若已有负数,就加触发器,避免新的产品再为负
这样只能解决数据库里数据不会出错,但是确实这个商品出现在了购物车里,虽然库存“看上去”没变负数, 说明判断的select 还是在没更新数据之前读取了库存数据,实际上这个时候正在update
Q315054403 2015-01-19
  • 打赏
  • 举报
回复
设计问题,简单处理就加个约束,库存数据必须>=0 若已有负数,就加触发器,避免新的产品再为负
编程有钱人了 2015-01-19
  • 打赏
  • 举报
回复
能用数据库“锁”解决 吗??
haiancdp0503 2015-01-19
  • 打赏
  • 举报
回复
可以使用 独占锁 来解决 MSDN看下
Tiger_Zhao 2015-01-19
  • 打赏
  • 举报
回复
update H_Product set kcsl =kcsl -1 where spid=10 AND kcsl > 0;
if(@@ROWCOUNT<>0)
抢购成功,加入购物车
else
print '库存不足'
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议,协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧