我觉得这种思路是类似乐观锁的 希望能和大家一起探讨。
库存表的表结构如下:
CREATE TABLE `sku_stock` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`sku_id` bigint unsigned NOT NULL,
`stock` DECIMAL(11,2) DEFAULT NULL COMMENT '库存数量',
PRIMARY KEY (`id`)
)
业务代码简化后逻辑大概是这样:1.扣库存2.保存订单。展开说下扣库存这一步,
int i = skuStockService.reduceStock(skuId, buyCount);
if (i==0) {
throw new RuntimeException("没有库存了,下订单失败,事务回滚");
}
sql 是这样的
<update id="reduceStock"> update sku_stock set stock = stock - #{buyCount} where stock- #{buyCount} >=0 and sku_id = #{skuId} ; </update>
锁库存的逻辑就是判断减库存sql的影响条数,假如为0 则证明库存不足,下单失败。加入为1则扣减库存成功顺利下单
压测试了下没有问题,性能上可能不是很高,因为修改的时候应该会锁表,实现很简单。
欢迎大家留言评论,有更好的方法给大家分享下。