Как обрабатывать, когда вызовы одновременно - PullRequest
0 голосов
/ 25 декабря 2018

Я использую 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;
}

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

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

 @Transactional(isolation = Isolation.SERIALIZABLE)

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

0 голосов
/ 25 декабря 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...