我覺得這種思路是類似樂觀鎖的 希望能和大家一起探討。
庫存表的表結構如下:
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則扣減庫存成功順利下單
壓測試了下沒有問題,性能上可能不是很高,因為修改的時候應該會鎖表,實現很簡單。
歡迎大家留言評論,有更好的方法給大家分享下。