#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
incheckIfNoEventExists
для блокирования конфликтующих действий.