现在我在项目中遇到了一个比较棘手的问题:
我们项目后台采用的是Hibernate+Spring+Servlet
前台采用的是Ajax异步提交
项目中有一个模块须保证一个序号的唯一和连续,我们的做法是:
删除操作:把删除的序号保存到单独的一张表里。
添加操作:先到保存删除的序号的表里取该用户的数据,如果没有,则用count()读取某用户所有的记录数+1。
保存操作:判断序列号用户有没有使用,如果使用了,则抛出序列号不唯一的错误。如果没有使用,则先从保存删除的序列号的表里删除该序列号,再保存数据。
现在的问题是:如果是几个人用,没有任何问题,但是100多人使用的时候,则有一小部分用户出现序列号不唯一的情况。我看了一下数据库,序列号不唯一的情况是没有从保存删除序列号的表里删除。
以下是业务层的代码:
Java代码
/**
*获取用户最大的序号
*@param userId 用户Id
*@return Integer 序号
*/
function Integer getNewSequence(long userId){
User user = new User(userId);
List<Sequence> sequences = this.getSequenceDao.findByUser(user);
if(sequences.size()>0){
return sequences.get(0).getSequence();
}
Integer sequence = this.getVoucherDao().getMaxSequence(user);
return sequence==null?1:(sequence+1);
}
/**
保存操作,如果id为0,则添加,否则修改。
*@param voucher
*@exception SequenceNotUniqueException
*/
function void save(Voucher voucher) throws SequenceNotUniqueException{
if(voucher.isNew()){//问题产生的地方
boolean isExistsSuchSequence = this.getVoucherDao.isExistsSuchSequence(voucher.getUser(),voucher.getSequence());
if(isExistsSuchSequence){
throw new SequenceNotUniqueException("序列号不唯一,请重新输入序列号");
}
this.getSequenceDao().remove(voucher.getUser(),voucher.getSequence());
this.getVoucherDao().insert(voucher);
}else{
Voucher v = this.getVoucherDao().findBySequence(voucher.getUser(),voucher.getSequence());
if(v!=null && v.getId()!=voucher.getId()){
throw new SequenceNotUniqueException("该序列号已使用,请使用其他的序列号");
}
this.getVoucherDao().update(voucher);
}
}
/**
删除操作
*@param voucher
*/
public void remove(Voucher voucher){
Sequence sequence = new Sequence(voucher.getUser(),voucher.getSequence());
this.getSequenceDao().insert(sequence);
this.getVoucherDao().remove(voucher);
}
我们项目后台采用的是Hibernate+Spring+Servlet
前台采用的是Ajax异步提交
项目中有一个模块须保证一个序号的唯一和连续,我们的做法是:
删除操作:把删除的序号保存到单独的一张表里。
添加操作:先到保存删除的序号的表里取该用户的数据,如果没有,则用count()读取某用户所有的记录数+1。
保存操作:判断序列号用户有没有使用,如果使用了,则抛出序列号不唯一的错误。如果没有使用,则先从保存删除的序列号的表里删除该序列号,再保存数据。
现在的问题是:如果是几个人用,没有任何问题,但是100多人使用的时候,则有一小部分用户出现序列号不唯一的情况。我看了一下数据库,序列号不唯一的情况是没有从保存删除序列号的表里删除。
以下是业务层的代码:
Java代码
/**
*获取用户最大的序号
*@param userId 用户Id
*@return Integer 序号
*/
function Integer getNewSequence(long userId){
User user = new User(userId);
List<Sequence> sequences = this.getSequenceDao.findByUser(user);
if(sequences.size()>0){
return sequences.get(0).getSequence();
}
Integer sequence = this.getVoucherDao().getMaxSequence(user);
return sequence==null?1:(sequence+1);
}
/**
保存操作,如果id为0,则添加,否则修改。
*@param voucher
*@exception SequenceNotUniqueException
*/
function void save(Voucher voucher) throws SequenceNotUniqueException{
if(voucher.isNew()){//问题产生的地方
boolean isExistsSuchSequence = this.getVoucherDao.isExistsSuchSequence(voucher.getUser(),voucher.getSequence());
if(isExistsSuchSequence){
throw new SequenceNotUniqueException("序列号不唯一,请重新输入序列号");
}
this.getSequenceDao().remove(voucher.getUser(),voucher.getSequence());
this.getVoucherDao().insert(voucher);
}else{
Voucher v = this.getVoucherDao().findBySequence(voucher.getUser(),voucher.getSequence());
if(v!=null && v.getId()!=voucher.getId()){
throw new SequenceNotUniqueException("该序列号已使用,请使用其他的序列号");
}
this.getVoucherDao().update(voucher);
}
}
/**
删除操作
*@param voucher
*/
public void remove(Voucher voucher){
Sequence sequence = new Sequence(voucher.getUser(),voucher.getSequence());
this.getSequenceDao().insert(sequence);
this.getVoucherDao().remove(voucher);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货