012--【秒杀】超卖的简单功能实现+测试

1096351-65690df4ab4b6323.png
image.png
  • 使用数据库锁进行秒杀功能实现(但是在大的项目中根本不会这样使用)
  • DAO层的代码

公式:UPDATE T_SEC_GOODS SET NUM=NUM-#{num} WHERE SKU=#{sku} AND NUM-#{num}>0

@Mapper
public interface KillDao {
    // 进行商品库存扣减
    @Update("UPDATE T_SEC_GOODS SET NUM=NUM-#{num} WHERE SKU=#{sku} AND NUM-#{num}>0")
    int updateGoodsCount(Map<String,Object> param);
}
  • Service层
@Service
public class KillServiceImpl implements KillService {
    @Resource
    KillDao killDao;

    @Override
    @Transactional
    public boolean updateGoodsCount(int num, String sku) {
        Map<String , Object> param = new HashMap<>();
        param.put("num",num);
        param.put("sku",sku);
        return killDao.updateGoodsCount(param)>0?true:false;
    }
}
  • 测试类编写(切记使用原子类进行数字查看,这个是最简单的测试)
@RunWith(SpringRunner.class)
@SpringBootTest
public class SeckillApplicationTests {

    public static final String SKU = "iPhone7";
    public static int UserCount = 5;
    public static int UserBuyCount = 3;
    public static AtomicInteger userSuccessCount = new AtomicInteger();
    public static AtomicInteger stackSuccessCount = new AtomicInteger();

    @Resource
    KillService killService;
    @Test
    public void contextLoads() {
        boolean flag = killService.updateGoodsCount(1, SKU);
        System.out.println("------------------数据更新成功:"+flag);
    }

    @Test
    public void contextLoadsThread() throws InterruptedException {
        for (int i = 0; i < UserCount; i++) {
            Thread task = new Thread() {
                @Override
                public void run() {
                    if (killService.updateGoodsCount(UserBuyCount, SKU)){
                        System.out.println("------------------数据更新成功");
                        userSuccessCount.incrementAndGet();//购买成功用户加一
                        stackSuccessCount.addAndGet(UserBuyCount);//购买成功商品
                    }else {
                        System.out.println("------------------数据更新失败");
                    }
                }
            };
            task.start();
            task.join();
        }
        System.out.println("------------------购买成功人数:"+userSuccessCount);
        System.out.println("------------------购买成功商品:"+stackSuccessCount);
    }
}
  • 测试类编写(控制线程数量,)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值