zoukankan      html  css  js  c++  java
  • 高并发情况下的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);
                }
            }
        }
  • 相关阅读:
    [COGS2580]偏序 II
    [COGS2479]偏序
    [BZOJ2716]天使玩偶
    [BZOJ4237]稻草人/[JOISC2014]かかし
    Ynoi2015 世上最幸福的女孩
    ARC098D Donation
    BZOJ3691 游行
    CF923E Perpetual Subtraction
    Luogu P4191 [CTSC2010]性能优化
    Topcoder SRM 590 Fox And City
  • 原文地址:https://www.cnblogs.com/laineyc/p/8964356.html
Copyright © 2011-2022 走看看