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);
                }
            }
        }
  • 相关阅读:
    Python 模块管理
    Python 练习: 计算器
    Linux 系统性能分析工具 sar
    Python 正则介绍
    Python ConfigParser 模块
    Python logging 模块
    Python hashlib 模块
    Python sys 模块
    09 下拉框 数据验证
    08 条件排序
  • 原文地址:https://www.cnblogs.com/laineyc/p/8964356.html
Copyright © 2011-2022 走看看