Есть метод с аннотацией @Transactional:
@Transactional
public void setName (String name) {
List<Name> names = nameReository.findByName(name);
names.forEach(oneName -> {
oneName.setDeleted(true);
nameReository.save(oneName);
});
Name name = new Name(name);
name.setDeleted(false);
name.setName(name);
nameReository.save(name);
}
И таблица в базе данных:
User {
name: String
deleted: Boolean
}
В таблице может присутствовать только одна пара значений name = 'Some name' и deleted = false. И сколько угодно name = 'Some name' и deleted = true. В методе есть проверка - если аналогичное значение поля name, которые мы пытаемся записать, уже существует, то мы переводим это поле в deleted = false и записываем новое с deleted = false.
Но если запустить в цикле обращение к ендпоинту, для записи в таблицу User данных, то иногда видимо не успевает проверка пройти и в базу записываются два одинаковых name с deleted = false.
Я решил добавить constraint в базу данных, что не может существовать больше одной записи c одинаковым значением name и deleted = false. Но на методе висит аннотация @Transactional. В методе сначала все записи переводятся в deleted = false а потом записывается новая. Таким образом, когда доходим до записи в базу, получаем ошибку ограничения...
Если удалить аннотацию, то сработает, но могут появиться другие ошибки и все запросы всеравно пройдут.
Как сделать проверку на уровне базы при этом сохранить возможность, которую нам дает аннотация?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости