高并发情况下的DB重复插入解决方案随笔

比如创建订单业务,订单号是唯一的。

多线程情况下,通过程序来判断订单号是否存在是不管用的。

简单的解决方案可以在数据哭设置唯一约束来解决。

此处之外可以通过缓存来解决这个问题伪代码:

  /**
     * 创建订单业务 不能有重复订单号
     */
    public void create(OrderCreateParameter parameter){
        String orderNo = parameter.getOrderNo();

        boolean canDelete = false;
        try{
            //创建一个订单查询
            OrderQuery orderQuery = new OrderQuery();
            orderQuery.setOrderNo(orderNo);
            OrderPo orderPo = orderDao.selectOne(orderQuery);
            //查询数据库,如果数据库已经有则抛出异常(程序一般也就判断到这里)
            if(orderPo != null){
                throw new Exception("订单已存在");
            }
            //利用redis原子性操作,如果插入失败 说明订单已存在
            if(!redis.setnx(orderNo, xxx)){
                throw new Exception("订单已存在");
            }
            canDelete = true;
       //创建一个订单po
            orderPo = new OrderPo();
            //从parameter赋值给orderPo 插入po
            orderDao.insert(orderPo);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(canDelete){
                redis.del(orderNo);
            }
        }
    }

 

posted @ 2018-04-27 20:40  LaineyC  阅读(538)  评论(0)    收藏  举报