Я использую Spring boot, чтобы сохранить данные в базе данных. Теперь у меня проблема, когда вы вызываете эту службу в то же время, когда мои данные дублируются в базе данных, потому что предыдущий запрос еще не завершен.
Я генерирую номер типа 00001, мне нужно запустить его из базы данных
но при запросе в одно и то же время в базе данных сохраните 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;
}
Это старая таблица, в которой дублируются данные.
Пожалуйста, предоставьте больше информации о вашем случае, примеры кода, если мы не делаем предположений и догадок.
@BSeitkazin ок.
Похоже, у вас есть логическая ошибка, глядя на вашу функцию saveData, я вижу, вы запрашиваете значение int idLatest, но не используете его. Показать все
@BSeitkazin ок.




Ниже приведены варианты, которые можно сделать в этом случае:
1.) имеют ограничение уникального ключа для столбца, имеющего значение 00001. Таким образом, вторая транзакция, которая пыталась зафиксировать то же значение, откатилась. И вы можете использовать механизм Spring-Retry для выполнения второй транзакции с обновленным значением.
2.) Используйте генератор настраиваемой последовательности для увеличения значения вместо того, чтобы обрабатывать его самостоятельно.
У меня есть решение для этого
@Transactional(isolation = Isolation.SERIALIZABLE)
и используйте весеннюю повторную попытку
у вас может быть ограничение уникального ключа для столбца, имеющего значение 00001. В результате вторая транзакция, которая пыталась зафиксировать то же значение, откатится