业务是这样的,输入用户名,判断用户不存在就添加,存在就不添加。service层代码如下(简化了):
public Object ut() {
// 判断用户db是否存在
User u = userDao.findByUserName("db");
if(u != null) {// 存在就返回1
System.out.println();
System.out.println("【有】");
System.out.println();
return 1;
}else {// 不存在就添加
u = new User();
u.setUserName("db");
u.setPassword(System.currentTimeMillis()+"");
userDao.save(u);
System.out.println("【无此用户】");
}
for(long i = 0;i<88888888L;i++) {// 模拟service执行了3-5秒
String a = ""+i;
}
return 0;
}
在for循环那里,我特地让这个方法执行3-5秒才能完成,那么问题来了,接口来了10个并发时
(数据库里没有db这个用户),控制台都是打印【无此用户】,然后就添加了10条记db用户的记录,而我想要的只有一条db用户记录,这种情况怎么解决,一开始我在controller层加上同步是可以,但是同步就慢了,,,请问这个情况怎么才能让数据里只有一条db用户的信息
用户的这种并发操作肯定会存在的,结果会导致数据重复录入,针对这个问题我们可以通过在数据库中用户名称字段添加唯一约束来进行控制,那么第一条数据插入后,其余9条数据就是插入失败。
现在很多系统都是web的,由于网络延迟,就会导致上述情况发生。
两种方式:
1.通过userDao调用框架立即保存;
2.设置数据库唯一键即可解决.
用户名唯一算是不错的方案了,借楼问下数据库隔离机制和事务有关系吗