У меня есть следующий сценарий в приложении Spring Boot: Мой сервисный метод считывает набор элементов из БД, где item.status = 'open'. Затем я изменю статус одного из этих элементов на «закрыт» и выполню некоторые действия.
Дело в том, что если на сервер поступает несколько запросов, запускаются параллельные выполнения слишком близко (в пределах миллисекунд), и эти параллельные выполнения имеют доступ к старому состоянию (где элемент все еще «открыт», когда он был фактически обработан), что приводит к обработке. предметы, подлежащие переработке, чего не может быть.
Я пробовал использовать режим изоляции транзакции для сериализации, но это не решает проблему.
Есть какие-нибудь предложения относительно того, что я делаю не так или что я могу попробовать?
Спасибо
Я бы посоветовал вам взглянуть на оптимистичные / пессимистические концепции блокировки и выбрать то, что вам больше всего подходит.
Если вы используете JPA, у него уже есть инструменты для это.
Если нет, то для оптимистической блокировки придется немного больше ручной работы, а для пессимистической - немного сахара, специфичного для базы данных (например, SELECT...FOR UPDATE).
Привет! Большое спасибо за ваш вклад. Пока что я создал метод DAO (JpaRepository), который выполняет блокировку PESSIMISTIC_WRITE. Вроде работает. Я думаю, что это был бы наименее инвазивный вариант с проектом, который у меня есть, и сегодня, поскольку реализация оптимистичной блокировки с помощью версии уже запланирована на будущее.