秒杀核心设计(减库存部分)-防超卖与高并发

方案二:

start transaction;

select id from buy_record where uid=$uid and goods_id=$goods_id for  update ;

if(结果不为空)

    抛异常,回滚。

insert into buy_record。。。

if(受影响行数<=0)

    抛异常,回滚。。。

select goods_num from goods where goods_id=$good_id for update ;

if(库存<=0)

    抛异常,回滚。。。

update goods set goods_num=goods_num-1  where goods_id=$goods_id ;

if(受影响行数<=0)

    抛异常,回滚。。。

该方法有效的防止了超卖,但是在每次select的时候加上了排它锁,每次select操作都会被堵塞 ,并发性能大大降低。

方案三:    对(uid,goods_id)加唯一索引!!

start transaction;

insert into buy_record。。。

if(唯一索引报错?)

    抛异常,已经秒过了,回滚。。。

update goods set goods_num=goods_num-1  where goods_id=$goods_id and goods_num>0 ;

if(受影响行数<=0)

    抛异常,商品秒完了,回滚。。。

该方法完美的解决了超卖与select排它锁导致的并发低的问题,并且4个sql缩减成2个sql语句。极大提升性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值