不知道这种思路有没有问题

不知道这种思路有没有问题

在更新库存的时候,可利用update的行级锁机制,在where条件后增加 库存数>=商品购买数量,这就解决了库存出现负数的情况(如果超卖,更新库存会失败,也就不需要回滚更新库存操作)。剩下要解决的就是订单数多于库存数的问题。可在更新库存后,获取更新的记录数,判断是否小于等于0,如果是,则抛出异常,库存不足无法购买。也就不需要利用其它的锁了。

<update id="updateProductCount">
 update product
 set count = count - #{purchaseProductNum,jdbcType=INTEGER},
 update_user = #{updateUser,jdbcType=VARCHAR},
  update_time = #{updateTime,jdbcType=TIMESTAMP}
 where id = #{id,jdbcType=INTEGER}
 and count >= #{purchaseProductNum,jdbcType=INTEGER}
</update>

int updateProductCount = productMapper.updateProductCount(purchaseProductNum, "xxx", new Date(), purchaseProductId);
if(updateProductCount<=0){
   throw new Exception("商品"+purchaseProductId+"库存不足,无法购买");
}

经过测试,是实际可行的。但不是很确定在分布式环境中,是不是百分比可行


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Java架构师讲师团 2020-03-05 19:59:34

这种方案可行,但是压力都在数据库上,访问量大的时候容易把数据库搞死。

  • 提问者 williamharley #1
    正常更新库存的时候,也是需要update库存数的,update不是自动有行级锁吗?在Update的where条件中增加一个条件 库存数>=购买数量,加不加这个条件,数据库压力是不变的吧?
    2020-03-05 20:05:42
  • 提问者 williamharley #2
    所以不是很能理解压力都是数据库上这句话。
    2020-03-05 20:07:46
  • 并发的update操作, 到了数据库层要变成串行,完全靠数据库的行锁,由于大量的update操作,都堆积到了这个行锁的地方,所以数据库的压力大。 主要是大量并发的情况。
    2020-03-06 08:06:14
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师