通过抢红包案例解决高并发问题

本文通过分析抢红包案例中出现的高并发问题,指出在减库存操作时由于非原子性导致线程不安全。提出解决方案,即利用数据库的SQL语句和锁机制来确保操作的原子性,从而改进业务逻辑,确保在并发环境下的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红包的mapper类

    @Select("select * from send_rea_package where id=#{id}")
    public Send getRedPackage(Integer id);

    /**
     * stock>0这个条件是为了解决最后一个红包被多次
     * @param send
     */
    //@Update("update send_rea_package set total_money=#{totalMoney},total=#{total},stock=#{stock},stock_money=#{stockMoney} where id=#{id}")
   @Update("update send_rea_package set stock=stock-1,stock_money=stock_money-2 where id=#{id} and stock>0")
    public int update(Send send);

用户mapper类

public interface ReceiveRedPackageMapper {
   
    @Insert("insert into receive_red_package(user_id,red_package_id,money,create_time,remark) values(#{userId},#{redPackageId},#{money},now(),#{remark})")
    public int add(Receive receive);

    @Select("select * from receive_red_package where user_id=#{userId} and red_package_id=#{redPackageId}")
    public  Receive getRedPackage(@Param("userId") Integer userId,@Param("redPackageId") Integer redPackageId);
}

业务类一


  @Autowired(required = false)
    ReceiveMapper receiveMapper;
    @Autowired(required = false)
    SendMapper sendMapper;
    @Override
    public void knock(Integer id) {
   
        Send redPackage = sendMapper.queryById(id);
        if (redPackage.getStock()==0){
   
             return;
        }else {
   
            Send send = new Send();
            //红包钱数
            int money = redPackage.getTotalMoney() / redPackage.getTotal();
            //剩余红包钱
            int totalMoney = redPackage.getTotalMoney() - money;
            //剩余红包数
            int total= redPackage.getTotal()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值