spring 并发访问 客户订单号设计
[code="java"][/code]我写的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号。
订单号是唯一的吧,在订单号上添加唯一索引如何?
date是在哪里定义的???
是类的成员变量么?如果是的话,这个类在spring里不能配成单例的。
简单点的方法就是声明saveOrders方法为同步方法(+synchronized),不过会影响吞吐量。
如果是Oracle数据库的话 加唯一索引跟该表中是否有数据无关的 可能很轻松的加上 建议LZ咨询下你们的DBA
如果在代码中加同步锁也不是不可,但是我感觉没必要。
多个人同时操作时日期就是同一个值
那你插入之前先检索以下,存在了就不插了
[quote]我的问题是两个人同时操作时比如都生成了订单号 201105001,那么一个人把订单数据保存后,另一个人就不应该使用这个订单号。上面的方法是service中的一个方法。[/quote]
这个东东在代码中是不好控制的,有个法子但也没法百分百解决问题,在DAO层执行插入前牺牲一个查询操作,先查一把,再执行插入。但是并不百分百靠谱的。
我不知道SQL Server支不支持后续新增唯一键索引,因为那个是最靠谱的。呵呵。
[quote]现在想到的方法是新建一个种子表(单独用来生产订单的),加乐观锁,处理异常来生产订单号不知道有没有什么好的方法[/quote]
恩,这个方法也是可以的。