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);
                }
            }
        }
  • 相关阅读:
    帮忙看看怎么优化这个最长的sql
    12种不宜使用的Javascript语法
    走格子
    乘法逆元
    完美字符串
    全排列问题
    A. Sorting Railway Cars
    Prim
    矩阵取数
    套题T8&T9
  • 原文地址:https://www.cnblogs.com/laineyc/p/8964356.html
Copyright © 2011-2022 走看看