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

编程有钱人了 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区 ,他们说这种情况要基于内存来处理了,保证变量的原子性

我想问问 如果纯用数据库能不能解决这个高并发的问题?解决库存负数的问题
...全文
617 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 '库存不足'

27,581

社区成员

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

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