Я искал способы, чтобы помешать двум пользователям думать, что они успешно модифицировали одни и те же данные одновременно.Например, если два пользователя загружают страницу редактирования, и оба пользователя работают на странице редактирования в течение нескольких минут, если пользователь A отправляет форму для сохранения, а затем пользователь B отправляет форму, данные в форме пользователя B получат выигрыш, поскольку она обновлена.в базе данных последней.Проблема в том, что оба пользователя думают, что их работа была сохранена без каких-либо проблем, когда работа пользователя А. теперь потеряна.
Я надеялся, что смогу использовать аннотацию JPA @ Version .Я бы сделал это, отслеживая версию при загрузке страницы редактирования и отправляя эту версию на сервер при отправке формы.Версия, поступающая из внешнего интерфейса, будет помещена в поле версии на объекте, загруженном для обновления, и затем мы будем полагаться на JPA, чтобы предотвратить сохранение, если версия не совпадает с тем, что находится в БД.В приведенном выше случае пользователь A победит, а пользователь B получит сообщение о том, что его сохранение не удалось, потому что данные были обновлены другим пользователем.
Проблема здесь в том, что я читал в нескольких местах сейчасчто значение, которое устанавливается в поле, связанном с аннотацией @Version
, не следует редактировать вручную.Вопрос в том, является ли это просто рекомендацией для нормального использования, но мой подход на самом деле сработает, или это нечто более фундаментальное, и есть другие причины не устанавливать поле версии вручную?
Наш стек является угловымСерверная часть end / Spring + JPA (Hibernate), так что имейте в виду, что весь обмен данными от внешнего интерфейса до внутреннего выполняется по REST, и мы конвертируем объекты Java в / из JSON.Итак, наше обычное редактирование / сохранение должно выглядеть примерно так:
- Браузер делает запрос на редактирование сущности с помощью идентификатора
- Бэкэнд получает запрос, ищет сущность, используяJPA преобразует сущность в JSON, отправляет в ответ клиенту.
- Браузер получает JSON из ответа, преобразует в объект, рисует и предварительно заполняет форму данными из редактируемого объекта.
- Пользователь вносит изменения и отправляет форму.Браузер отправляет новый запрос в бэкэнд с JSON, представляющим измененную сущность.
- Бэкэнд ищет сущность, используя JPA, модифицирует ее и сохраняет ее, используя JPA.
Для ясностина шаге 5, если мы используем аннотацию @Version
и не устанавливаем ее вручную, версия не изменится, и у нас все еще будет проблема, когда один пользователь, отправляющий форму, потенциально перезапишет изменения другого.Я полагаю, что интерфейс отслеживает номер версии, отправляет его обратно на сервер с изменениями, а на шаге 5 сервер задает номер версии для извлеченного объекта. Если это произойдет, не будетсбой сохранения, который непреднамеренно перезаписывает сохранение предыдущего пользователя?