比如创建订单业务,订单号是唯一的。
多线程情况下,通过程序来判断订单号是否存在是不管用的。
简单的解决方案可以在数据哭设置唯一约束来解决。
此处之外可以通过缓存来解决这个问题伪代码:
/** * 创建订单业务 不能有重复订单号 */ 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); } } }