Допустимый вариант для сериализуемого уровня изоляции

#database #spring #postgresql #transactions #spring-data-jpa

#База данных #spring #postgresql #транзакции #spring-data-jpa

Вопрос:

Я пытаюсь проверить, должен ли СЕРИАЛИЗУЕМЫЙ уровень изоляции соответствовать следующему случаю: таблица событий содержит записи событий, запланированных на заданную дату и время для конкретного пользователя. Служба должна проверить отсутствие уже запланированных событий для данного пользователя и временных рамок, и если событий не существует, создать новое событие (операция upsert).

 @Transactional(isolation = Isolation.SERIALIZABLE)
@Override
public Event createEvent(Event event) {  
  eventRepository.checkIfNoEventExists(event);
  ...
  // load entities from different tables and inject to event
  ...
  eventRepository.save(event);
}
  

Будет ли эта транзакция блокировать другие параллельные транзакции, которые выполняют операцию записи в другие таблицы? Какова наилучшая практика для обработки сбоя:

не удалось сериализовать доступ из-за зависимостей чтения / записи между транзакциями

Было бы лучше ограничить область действия СЕРИАЛИЗУЕМОГО уровня изоляции простой проверкой и сохранением (например, в пользовательском методе репозитория)?

Комментарии:

1. SERIALIZABLE подходит для этого, и в этом случае ожидаются ошибки сериализации. Ответ заключается в том, чтобы просто повторить транзакцию. Альтернативой является использование SELECT ... FOR UPDATE in checkIfNoEventExists для блокирования конфликтующих действий.