业务场景
在实际开发过程中,会遇到下单操作,这里涉及到库存问题。
无锁情况下下单
假如现在有一个场景,系统中有一个用户下单接口,但在用户下订单前一定要去检查库存,确保库存足够了才给用户下单,假如目前是单台服务器。
由于系统有一定的并发,所以会预先将商品的库存保存在 Redis
中,用户下单的时候会更新 Redis
的库存。
-
用户下单
-
检查库存
-
更新数据库数量
-
锁定库存
-
继续执行后续代码
单进程jvm加锁
现在有两个线程用户
访问,线程1【用户1】和线程2【用户2】
,假如在不加锁的情况下,当某个时刻,Redis和mysql的库存为1。
线程1执行到第3步后,还没执行到第四步,但线程2已执行到第2步。此时mysql的数据库为0,Redis
的数据库为线程2可以执行第3步,执行完后,mysql数据库的库存为-1。
因而,这里就出现了并发带来第二超卖问题
,针对这个问题,线程1需要锁定2、3、4操作,然后线程2才能执行第2步操作。</