<yinweijian> 2017-11-02 14:50 采纳率: 100%
浏览 1885
已采纳

接口并发,由于Service层处理时间长,导致数据有误,诚心请教

业务是这样的,输入用户名,判断用户不存在就添加,存在就不添加。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用户的信息

  • 写回答

3条回答 默认 最新

  • Sam.Shi 2017-11-02 14:59
    关注

    用户的这种并发操作肯定会存在的,结果会导致数据重复录入,针对这个问题我们可以通过在数据库中用户名称字段添加唯一约束来进行控制,那么第一条数据插入后,其余9条数据就是插入失败。
    现在很多系统都是web的,由于网络延迟,就会导致上述情况发生。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?