这是一个令很多人都头疼的问题 想起之前第一次做商城的时候就被这个问题给难住了
面对这个问题一般的解决办法有几个:
1:适用于较小型应用 一般采用 锁 来解决
锁又有封为乐观锁以及悲观锁 悲观锁就不做过多的解释了,因为性能上比较不靠谱 所以建议采用乐观锁的解决方案
乐观锁
其实就有是在更新数据的时候加多几个where 条件 这样能够有效的防止多用户同时对一条数据进行操作
例如:
UPDATE FROM goods SET num = num - 1 WHERE goodsid = 2 AND num > 0
这条语句仅仅只是加多了个 WHERE 条件 num > 0 但是其足以应付一般的应用的并发情况
例如:
当前库存 num 为 1
且有两个用户同时发起下单请求
那么这时候 稍微慢的那个用户就会遇到 num = 0 的情况 所以where条件不成立 插入失败 结果就是只有一个人下单成功。
当然还有更多情况可使用乐观锁解决 例如取不重复数据时 可多添加几个where 字段 取完即更新它 那么下次就不会有其他用户取到
如果是针对只有一件商品的秒杀情况 那么可以这么解决:
订单表(goodsid(商品) 加唯一索引)
start transaction;insert into buy_record... if(唯一索引报错?){ 抛异常,已经秒过了,回滚..} UPDATE goods SET num=num-1 WHERE goodsid=2 AND num>0 ; if(受影响行数<=0){ 抛异常,商品秒完了,回滚...}
2:大型应用 高并发
一般采用 进行 这里不过多介绍