повторяющаяся запись происходит в MySQL - PullRequest
0 голосов
/ 09 января 2019

В 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  

сервисный код

Java-сущность

MySQL запись

1 Ответ

0 голосов
/ 09 января 2019

Это очень похоже на проблему параллелизма. Код делает две вещи:

  1. получить все ассоциации между пользователем и продавцом
  2. если нет ассоциации, создайте

Проблема возникает при выполнении нескольких одновременных вызовов на addSalesmanUser. В этом случае первый шаг может получить пустой список для нескольких одновременных вызовов, потому что в момент его выполнения никакие другие записи не вставляются. Таким образом, второй шаг будет вставлять несколько записей.

Вы писали, что это не проблема, но, пожалуйста, посмотрите на столбец времени создания, разница составляет 4 мс, что говорит о том, что это было одновременное выполнение.

Самый простой способ справиться с этим - применить ограничение, согласно которому для данного пользователя в базе данных должен быть только один продавец. Создайте уникальное ограничение для пары (user_id, salesman_id). С его помощью только один вызов будет успешным.

...