Spring @Transactional и Postgresql constraint

292
13 апреля 2019, 23:40

Есть метод с аннотацией @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 а потом записывается новая. Таким образом, когда доходим до записи в базу, получаем ошибку ограничения...

Если удалить аннотацию, то сработает, но могут появиться другие ошибки и все запросы всеравно пройдут.

Как сделать проверку на уровне базы при этом сохранить возможность, которую нам дает аннотация?

READ ALSO
NullPointerException при передаче ArrayList из сервлета в JSP

NullPointerException при передаче ArrayList из сервлета в JSP

Столкнулся с такой проблемой: передаю в JSP ArrayList из сервлета с помощью requestsetAttribute(), но при попытке получить элемент этого списка в JSP получаю...

208
Tomcat не видит драйвер JDBC MS SQL

Tomcat не видит драйвер JDBC MS SQL

В maven-проекте, запускаемом из NetBeans 82 подключена зависимость

187
JavaFX vs. Swing

JavaFX vs. Swing

Давненько не брал в руки шашку, как то решил переписать свою аппу под Android на толстого десктоп клиента и обнаружил, что Swing типа как бы умер

190