问题描述
我写的demo 用的是flex+hibernate+Spring 需求是新增一个订单,(订单号是唯一的日期加数字如"s201105001")比如在spring 中有一个保存订单数据的方法 public void saveOrders(List list)throws exception{ String ddh=cal(date);//这个方法是依据日期,查找订单表的订单号再生成日期 for(int i=0;i<list.size();i++){ Order o=list.get(i); o.setddh(ddh); save(o);//保存数据 }}问题是如果是并发访问的话,订单号就可能重复。求解? 问题补充:这是一个遗留的老系统,订单号不能加索引。日期是方法中的局部变量。我担心的是同时保存订单时,订单号有可能重复。
解决方案
首先你要确认是不是因为多人同时操作,时间相同,造成产生相同的ID号。如果是这样的话,那就是这个ID号的生成策略有问题了。建议在ID号上再加上人员ID,保证产生唯一的ID号。
解决方案二:
引用现在想到的方法是新建一个种子表(单独用来生产订单的),加乐观锁,处理异常来生产订单号不知道有没有什么好的方法恩,这个方法也是可以的。
解决方案三:
引用我的问题是两个人同时操作时比如都生成了订单号 201105001,那么一个人把订单数据保存后,另一个人就不应该使用这个订单号。上面的方法是service中的一个方法。这个东东在代码中是不好控制的,有个法子但也没法百分百解决问题,在DAO层执行插入前牺牲一个查询操作,先查一把,再执行插入。但是并不百分百靠谱的。我不知道SQL Server支不支持后续新增唯一键索引,因为那个是最靠谱的。呵呵。
解决方案四:
那你插入之前先检索以下,存在了就不插了
解决方案五:
多个人同时操作时日期就是同一个值
解决方案六:
如果是Oracle数据库的话 加唯一索引跟该表中是否有数据无关的 可能很轻松的加上 建议LZ咨询下你们的DBA如果在代码中加同步锁也不是不可,但是我感觉没必要。
解决方案七:
简单点的方法就是声明saveOrders方法为同步方法(+synchronized),不过会影响吞吐量。
解决方案八:
date是在哪里定义的???是类的成员变量么?如果是的话,这个类在spring里不能配成单例的。
解决方案九:
订单号是唯一的吧,在订单号上添加唯一索引如何?