短视频平台开发,如何解决商城中的超卖问题?
短视频平台开发,如何解决商城中的超卖问题?
超卖问题是典型的多线程安全问题,针对这一问题在短视频平台开发中常见解决方案就是加锁:
锁有两种:
一,悲观锁: 认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如Synchronized、Lock都属于悲观锁;
二,乐观锁: 认为线程安全问题不一定会发生,因此不加锁,只是在更新数据时去判断有没有其它线程对数据做了修改。
如果没有修改则认为是安全的,自己才更新数据。 如果已经被其它线程修改说明发生了安全问题,此时可以重试或异常。
下面介绍乐观锁的两种实现:
第一种,添加版本号:
每扣减一次就更改一下版本号,每次进行扣减之前需要查询一下版本号,只有在扣减时的版本号和之前的版本号相同时,才进行扣减。
第二种,CAS法
因为每扣减一次,库存量都会发生改变的,所以我们完全可以用库存量来做标志,标志当前库存量是否被其他线程更改过(在这种情况下,库存量的功能和版本号类似)
下面给出 CAS 法扣除库存时,针对超卖问题的解决方案:
// 扣减库存 boolean success = seckillVoucherService.update() .setSql("stock = stock - 1") // set stock = stock - 1 .eq("voucher_id", voucherId).gt("stock", 0) // where id = ? and stock > 0 .update();
请注意上述的 CAS 判断有所优化了的,并不是判断刚查询的库存和扣除时的库存是否相等,而是判断当前库存是否大于 0。
因为 判断刚查询的库存和扣除时的库存是否相等会出现问题:假如多个线程都判断到不相等了,那它们都停止了扣减,这时候就会出现没办法买完了。
而 判断当前库存是否大于 0,则可以很好地解决上述问题!
以上就是短视频平台开发,如何解决商城中的超卖问题?, 更多内容欢迎关注之后的文章