<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条)

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码