Spring Boot - блокировать чтение БД при методе обслуживания

У меня есть следующий сценарий в приложении Spring Boot: Мой сервисный метод считывает набор элементов из БД, где item.status = 'open'. Затем я изменю статус одного из этих элементов на «закрыт» и выполню некоторые действия.

Дело в том, что если на сервер поступает несколько запросов, запускаются параллельные выполнения слишком близко (в пределах миллисекунд), и эти параллельные выполнения имеют доступ к старому состоянию (где элемент все еще «открыт», когда он был фактически обработан), что приводит к обработке. предметы, подлежащие переработке, чего не может быть.

Я пробовал использовать режим изоляции транзакции для сериализации, но это не решает проблему.

Есть какие-нибудь предложения относительно того, что я делаю не так или что я могу попробовать?

Спасибо

1
0
44
1

Ответы 1

Я бы посоветовал вам взглянуть на оптимистичные / пессимистические концепции блокировки и выбрать то, что вам больше всего подходит.

Если вы используете JPA, у него уже есть инструменты для это.

Если нет, то для оптимистической блокировки придется немного больше ручной работы, а для пессимистической - немного сахара, специфичного для базы данных (например, SELECT...FOR UPDATE).

Привет! Большое спасибо за ваш вклад. Пока что я создал метод DAO (JpaRepository), который выполняет блокировку PESSIMISTIC_WRITE. Вроде работает. Я думаю, что это был бы наименее инвазивный вариант с проектом, который у меня есть, и сегодня, поскольку реализация оптимистичной блокировки с помощью версии уже запланирована на будущее.

user1339768 02.07.2018 21:55

Другие вопросы по теме