Как обрабатывать запросы на звонок одновременно

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

Я генерирую номер типа 00001, мне нужно запустить его из базы данных

  1. Я получаю последнее из БД
  2. тогда 00001 + 1 = 00002
  3. сохранить в базу данных

но при запросе в одно и то же время в базе данных сохраните 00002 для 2 записей.

     @Transactional
public List<Object> saveData(String data) {
 //validate data
 //Get Last Data    
 //set prepare data
 //save data
    int idLatest = Integer.parseInt(getLatest("7", "8"));
    List<Object> objects = autoGenarateEntity(idLatest);
    Repository.save(Object);

}

   public String getLatest(String idFirst, String idSecond){
    Optional<Object> running = Repository.findByBIdStartingWithOrderByBIdDesc(idFirst, idSecond).stream().findFirst();
    if (running.isPresent()){
        String bId =running.get();
        return bId.getBId();
    }else {
        return "70000000";
    }

}

   public List<Object> autoGenarateEntity(int idLatest){
    List<Object> objects = new ArrayList<>();
    IntStream.range(1, 5 + 1).forEach(i -> {
        Object obj = new Object();
        obj.setBId(Integer.toString(idLatest + i));

        obj.add(Object);
    });
    return objects;
}

у вас может быть ограничение уникального ключа для столбца, имеющего значение 00001. В результате вторая транзакция, которая пыталась зафиксировать то же значение, откатится

Ankur 25.12.2018 07:52

Это старая таблица, в которой дублируются данные.

oreoman 25.12.2018 07:56

Пожалуйста, предоставьте больше информации о вашем случае, примеры кода, если мы не делаем предположений и догадок.

BSeitkazin 25.12.2018 08:35

@BSeitkazin ок.

oreoman 25.12.2018 08:50

Похоже, у вас есть логическая ошибка, глядя на вашу функцию saveData, я вижу, вы запрашиваете значение int idLatest, но не используете его. Показать все

BSeitkazin 25.12.2018 08:57

@BSeitkazin ок.

oreoman 25.12.2018 09:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
76
2

Ответы 2

Ниже приведены варианты, которые можно сделать в этом случае:

1.) имеют ограничение уникального ключа для столбца, имеющего значение 00001. Таким образом, вторая транзакция, которая пыталась зафиксировать то же значение, откатилась. И вы можете использовать механизм Spring-Retry для выполнения второй транзакции с обновленным значением.

2.) Используйте генератор настраиваемой последовательности для увеличения значения вместо того, чтобы обрабатывать его самостоятельно.

У меня есть решение для этого

 @Transactional(isolation = Isolation.SERIALIZABLE)

и используйте весеннюю повторную попытку

Другие вопросы по теме