mysql中出现重复记录

Posted

技术标签:

【中文标题】mysql中出现重复记录【英文标题】:duplicate record occur in mysql 【发布时间】:2019-06-03 20:56:19 【问题描述】:

mysql中有一些重复记录。似乎某些特殊情况会触发它。我检查了我的代码,但没有推理出来。

spring-boot2.1、mybatis2.1、mysql5.7

 @Override
    public int addSalesmanUser(ShareSalesmanUser shareSalesmanUser) 
        if (shareSalesmanUser.getUserId() == null || shareSalesmanUser.getSalesmanId() == null) 
            throw new ParamError("param error");
        

        Example example = new Example(ShareSalesmanUser.class);
        example.createCriteria().andEqualTo("userId", shareSalesmanUser.getUserId());
        List<ShareSalesmanUser> list = shareSalesmanUserMapper.selectByExample(example);
        if (list != null && list.size() > 0) 
            throw new ServerError("bound yet");
        
        shareSalesmanUser.setCreateTime(new Date());
        shareSalesmanUser.setUpdateTime(new Date());
        int rs = shareSalesmanUserMapper.insertSelective(shareSalesmanUser);
        return rs;
    
user_salesman_id  user_id  salesman_id  register_bysalesman create_time update_time delete_time
253 311 7   0   2019-01-05 09:23:46.612000  2019-01-05 09:23:46.612000  
248 310 7   0   2019-01-05 09:21:18.483000  2019-01-05 09:21:18.483000  
249 310 7   0   2019-01-05 09:21:18.488000  2019-01-05 09:21:18.488000  
250 310 7   0   2019-01-05 09:21:18.492000  2019-01-05 09:21:18.492000  
251 310 7   0   2019-01-05 09:21:18.496000  2019-01-05 09:21:18.496000  
252 310 7   0   2019-01-05 09:21:18.511000  2019-01-05 09:21:18.511000  

service code

java entity

mysql record

【问题讨论】:

我不知道,谁能给点提示? 一个账号绑定一个业务员,自己绑定。所以它可能不是并发问题。 这里没有重复 【参考方案1】:

这看起来很像并发问题。代码做了两件事:

    获取用户和推销员之间的所有关联 如果没有关联,则创建一个

当对addSalesmanUser 执行多个并发调用时会出现此问题。在这种情况下,第一步可能会为多个并发调用获取空列表,因为在执行时没有插入其他记录。所以第二步会插入多条记录。

您说这不是问题,但请查看创建时间列,相差 4 毫秒,这表明它是并发执行。

处理此问题的最简单方法是强制执行约束,即对于给定用户,数据库中应该只有一个推销员。为 (user_id, salesman_id) 对创建唯一约束。有了它,只有一次调用会成功。

【讨论】:

非常感谢。我知道为(user_id, salesman_id) 创建唯一约束的方式。但我想知道它将如何触发并发问题。这可能不是只有用户自己才能执行该操作的原因。怎么会发生?我们已经禁止在前端双击。还是因为用户的网络状况较差?再次感谢 Roman Konoval。 您在数据库中获得了多条记录。所以这段代码几乎同时被执行了多次。在某种程度上完成了多次调用。要么您在前端有错误并且它发送多个请求(如果是这种情况,请检查访问日志)或者您的服务客户端中有一些逻辑(启用登录 mybatis 以查看最好使用包含的线程 id 执行的查询) 同时执行多次addSalesmanUser Thannnnnnnnnnnks。我通过检查 nginx 日志找到了问题的根源。一个前端发送了多个请求,因此产生了并发问题。感谢您抽出宝贵时间,Roiman Konoval。

以上是关于mysql中出现重复记录的主要内容,如果未能解决你的问题,请参考以下文章

MySql数据库,查询数据导出时会出现重复的记录(数据越多越明显)

如何从 MySQL 表中删除重复记录? [复制]

MySQL处理重复数据和SQL 注入

MYSQL数据库,老是被插入重复记录,怎么解决?(附代码)

MySQL中提取重复记录的查询是啥[重复]

mysql 查询怎么去除重复列