Spring Transaction и Hibernate считывают не самые последние данные - PullRequest
0 голосов
/ 05 ноября 2019

Мне пришлось вставить объект в базу данных. Я использую транзакции Spring и спящий режим. Но перед тем, как вставить объект, мне нужно было проверить, существует ли он, если да, то я выбрасываю пользователю приятное исключение. Вот уловка, я не добавил уникальное ограничение на сущность для столбца, и из-за некоторого масштаба у меня есть дубликаты записей в моей базе данных.

У меня есть следующие вопросы

  1. Во-первых, почему транзакция Spring не нашла сущность, когда я искал ее перед вставкой.
  2. Как можно предотвратить ее, не принимая пессимистическую блокировку для вставки.

Я предполагаю, что Spring-транзакция берет старую копию базы данных перед началом транзакции и в то же время, если какая-либо транзакция записывает ту же сущность. У нас будут повторяющиеся записи.

Я использую метод checkAndInsert в моем слое dto, а следующий - мой сервисный слой

@Transactional(readOnly = true)
public Record getByName(String name){
    return dao.getByName(name);
}

@Transactional
public void createRecord(Record record) {
    dao.persist(record)
}

@Transactional
public void checkAndInsert(Record record){
    if(getByName(record.getName()) != null){
        createRecord(record);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...