Есть метод с аннотацией @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 а потом записывается новая. Таким образом, когда доходим до записи в базу, получаем ошибку ограничения...
Если удалить аннотацию, то сработает, но могут появиться другие ошибки и все запросы всеравно пройдут.
Как сделать проверку на уровне базы при этом сохранить возможность, которую нам дает аннотация?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости