自己建网站的流程,传媒公司网站制作,网站开发制作的流程有哪些,常熟住房和城乡建设局网站首页在商品购买的过程中#xff0c;库存的抵扣过程#xff0c;一般操作如下#xff1a;
1、select根据商品id查询商品的库存。
2、根据下单的数量#xff0c;计算库存是否足够#xff0c;如果存库不足则抛出库存不足的异常#xff0c;如果库存足够#xff0c;则减去扣除的…在商品购买的过程中库存的抵扣过程一般操作如下
1、select根据商品id查询商品的库存。
2、根据下单的数量计算库存是否足够如果存库不足则抛出库存不足的异常如果库存足够则减去扣除的库存得到最新的库存剩余值。
3、set设置最新的库存剩余值。
上述过程的伪代码如下
// 根据商品id获取商品剩余库存
select stock_remaing from stock_table where id${goodsId};// 操作库存
// 比较库存
if(stock_remaing quantity){// 抛出库存不足的异常
}
else{// 抵扣以后的库存值int new_stockstock_remaing - quantity;
}// 根据商品id设置计算后的库存
update stock_table set stock_remaing ${new_stock} id${goodsId};并发修改数据库存超卖
如果数据库事务的隔离级别不是串行化serializable根据事务的特性在并发修改的时候可能会出现写覆盖的问题。
假设商品的剩余库存stock_remaing 为100客户A下单20客户B下单30在并发扣库存的时候可能存在超卖。如果客户A和客户B同时获取剩余库存为100则会出现事务后提交的值会覆盖前一个客户提交的值有可能剩余的库存是80或者70。
流程如下 加锁更新存库
为了在事务控制中防止写覆盖你会想到使用select for update的方式将该商品的库存锁住然后执行余下的操作。
流程如下 以上使用悲观锁方式在分布式服务中如果并发情况比较高的时候扣减库存的操作是串行操作效率很低。
使用乐观锁的方式更新
在更新的时候使用CAS版本号更新重试条件重试次数或者重试时间限制乐观锁的方式更新库存。此时如果客户A和客户B同时读取到库存剩余100在更新的时候有一个操作会失败。
流程如下 该种方式可以大大提高并发性也可以保证数据的一致性通过重试次数和重试时间的条件控制可以防止过多的重试带来的数据库压力。
可以使用直接递减的方式执行么
在抵扣库存的时候有的人提议不执行select计算set三段式的操作直接扣减的方式并且对于扣减到小于零的情况作了判断。伪代码如下
update stock_table set remaing_stockremaing_stock-${quantity}
where id 商品id
and remaing_stock${quantity};在分布式服务调用中因为网络异常获取服务器异常可能在微服务调用时存在服务重试。例如场景的网关超时服务重试机制。此时该种方式不满足幂等性而存在多扣的情况。例如同一用户扣减库存时服务重试极端情况下该用户扣减库存操作执行多次则就出现了商品超卖。
可以使用redis进行库存的抵扣么
答案是可以使用redis的事务性扣减余额但在CAS机制上比mysql没有优势高性能是因为其内存存储的原因带来的副作用是数据有丢失风险。
最后说一句(求关注!别白嫖)
如果这篇文章对您有所帮助或者有所启发的话求一键三连点赞、转发、在看。
关注公众号woniuxgg在公众号中回复笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记回复面试、开发手册、有超赞的粉丝福利