单机下秒杀


秒杀在日常中很常见,比如淘宝京东等网上商城的抢购,比如12306上火车票的购买。对于秒杀,最容易且最需要解决的就是超卖问题,例如库存中只有100件产品,如果不加处理同时接收到200个购买请求,就会出现超卖,卖出的数额就会超过最大库存。

针对超卖问题有两种解决方案,第一种是悲观锁,即认定所有请求都是不安全的,只要有请求过来就要获得锁才能执行下一步,就要把一些流程使用synchronized或者lock锁起来。第二种是乐观锁,乐观锁不是真正意义上的锁,而是使用数据库的字段,当更改数据的时候先把这个字段查询出来,执行修改事务的时候sql语句中增加对该字段的判断,判断当前该字段与此前查询出来结果是否一致,如果一致就提交事务,否则就执行失败,事务回滚。

boolean isUpdate = seckillVoucherService.update()
                    .setSql("stock = stock - 1")
                    .eq("voucher_id", voucherId)
                    //.eq("stock",seckillVoucher.getStock())      //  添加乐观锁条件判断避免超卖
                    .gt("stock", 0)
                    .update();