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

接口并发,由于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条)

报告相同问题?

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分 合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备