spring boot 实现抢购商品(下)

简介: spring boot 实现抢购商品(下)

接下来就是启动下


image.png


调试下,没有问题,我们去压测下,因为正常情况下我们需要压测我们的接口,我们用下jMeter,


image.png


我们去并发请求,


image.png


肯定有成功,有失败,我们去看下,我们的数据库,。


image.png


我们发现,我们的商品发超了。可能是在扣库存的其他的线程也在操作,没有做区分,就导致了超发,这样我们可以用乐观锁 悲观锁,或者reids来实现。

我们实现下悲观锁,


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.product.demo.dao.ProductDao">
    <select id="getProduct" parameterType="long" resultType="ProductPo">
       SELECT id,`name`,stock,price,version,note FROM product WHERE id=#{id} for  update
    </select>
    <update id="decreaseProduct">
        update  product set stock=stock-#{quantity} where  id=#{id}
    </update>
</mapper>


这样就实现了悲观锁,我们来测试下,


image.png


我们看下数据库,


image.png


没有出现超发现象,但是出现了性能有所下降的问题,可以去查看购买记录,但是这样能保证我们的发售的商品不超卖,牺牲一些性能的,


我们看下乐观锁,用乐观锁来实现下,我们使用版本号字段来控制,版本号增加,扣库存,


<update id="decreaseProduct">
        update  product set stock=stock-#{quantity},version=version+1 where  id=#{id} and version=#{version}
    </update>


对应mapper修改


@Mapper
public interface ProductDao {
    public ProductPo getProduct(Long id);
    public int decreaseProduct(@Param("id") Long id,
                               @Param("quantity") int quantity,
                               @Param("version") int version);
}


修改逻辑代码


@Override
    @Transactional
    public boolean purchase(Long userId, Long productid, int quantity) {
        ProductPo productPo=productDao.getProduct(productid);
        if (productPo.getStock()<quantity){
            return false;
        }
        int version=productPo.getVersion();
        int reslut=productDao.decreaseProduct(productid,quantity,version);
        if (reslut==0){
            return  false;
        }
        PurchaseRecordPo purchaseRecordPo=initpush(userId,productPo,quantity);
        puchaesre.insertPurcha(purchaseRecordPo);
        return true;
    }


完成后,我们去修改下调试下,然后进行并发压测,


image.png


我们发现了,错误率上升了,看下记录,发现部分记录没有增加进去。但是库存扣减了,我们这个时候可以利用增加重入次数,来对错误的进行重试。


@Override
    @Transactional
    public boolean purchase(Long userId, Long productid, int quantity) {
        for(int i=0;i<3;i++){
            ProductPo productPo=productDao.getProduct(productid);
            if (productPo.getStock()<quantity){
                //库存不足
                return false;
            }
            //获取版本号
            int version=productPo.getVersion();
            int reslut=productDao.decreaseProduct(productid,quantity,version);
            //扣库存失败
            if (reslut==0){
                //重试
                continue;
            }
            PurchaseRecordPo purchaseRecordPo=initpush(userId,productPo,quantity);
            puchaesre.insertPurcha(purchaseRecordPo);
            return true;
        }
        return  false;
    }


这样增加重试机制后,错误次数减少。  今个是可以发现,其实上这样操作是保证了扣减库存的增强,但是一般在企业中 通常考虑用NoSQl作为解决方案,比较常用的是redis,大概的思路是利用redis响应高并发的用户请求,定时任务将redis的购买信息保存到数据库中。

相关文章
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的会员制度管理的商品营销系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的会员制度管理的商品营销系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
3月前
|
前端开发 数据库
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
这篇文章介绍了如何在SpringBoot+Vue框架下实现购物车功能,包括防止商品重复加入、展示商品信息、删除商品时的提示,以及点击图片放大的前端实现。
SpringBoot+Vue实现商品不能重复加入购物车、购物车中展示商品的信息、删除商品重点提示等操作。如何点击图片实现图片放大
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的二手商品网站的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的二手商品网站的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的商品推荐系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的商品推荐系统附带文章源码部署视频讲解等
41 0
基于springboot+vue.js+uniapp小程序的商品推荐系统附带文章源码部署视频讲解等
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的二手商品网站附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的二手商品网站附带文章源码部署视频讲解等
20 0
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的在线商品交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的在线商品交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
|
6月前
|
供应链 JavaScript Java
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的免税商品优选购物商城系统附带文章和源代码
基于SpringBoot+Vue的免税商品优选购物商城系统附带文章和源代码
51 1
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的网上商品订单转手系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的网上商品订单转手系统附带文章源码部署视频讲解等
44 0