mysql - mysql中出现重复记录

标签 mysql spring-boot mybatis

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. 获取用户和销售员之间的所有关联
  2. 如果没有关联,则创建一个

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

您写道这不是问题,但请查看创建时间列,差异为 4 毫秒,这表明这是并发执行。

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

关于mysql - mysql中出现重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54104112/

相关文章:

Mysql内部连接和空精度舍入

java - MyBatis 日志中 pretty-print 查询

java - 为 Ibatis 加密一个属性文件

mysql - 将 CSV 导入 MySQL,在行尾留下引号

php - Symfony2 Doctrine,通过外键连接表

spring - 使用来自不同数据库的 bean hibernate DuplicateMappingException

java - 将 querydsl 与 Spring Boot、Gradle 和 Idea 一起使用时,QClasses 中未解析的符号

java - 为什么 MyBatis 在执行每条语句后都会关闭 session ?

php - 我怎样才能使这段代码简短且易于阅读?

java - 是否可以使用 th-field 来检索 Thymeleaf 中列表的值?