短视频平台开发,如何解决商城中的超卖问题?

短视频平台开发,如何解决商城中的超卖问题?

 

解决方案

超卖问题是典型的多线程安全问题,针对这一问题在短视频平台开发中常见解决方案就是加锁:

锁有两种:

一,悲观锁: 认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如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,则可以很好地解决上述问题!

以上就是短视频平台开发,如何解决商城中的超卖问题?, 更多内容欢迎关注之后的文章

posted @ 2025-06-14 10:11  云豹科技-苏凌霄  阅读(7)  评论(0)    收藏  举报