Обработка версии оптимистичной блокировки JPA - значение версии должно быть перенесено на клиентскую сторону или?

Мне интересно, как обрабатывать свойство оптимистичной версии блокировки в классе сущностей с использованием JPA (основы верхней ссылки) от сервера к клиенту и наоборот.

Вот сценарий.

  1. Из браузера пользователь отправляет запрос на сервер, запрашивая информацию об отдельном пользователе для редактирования.

  2. Сервер обрабатывает запрос и возвращает результат браузеру. Код сервера выглядит примерно так:

    EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();

    Пользователь u = (Пользователь)em.find(User.class, myUserId);

    вернуть тебя; //отвечаем браузеру

Здесь мое замешательство заключается в том, что в таблице пользователей есть столбец "version" для optimistic locking.

Это означает, что значение поля версии также отправляется обратно клиенту, даже если клиент (я или кто-либо другой) никогда не будет его использовать. Поле версии должно использоваться в коде на стороне сервера.

Так правильно ли отправлять номер версии клиенту? Потому что иначе я не могу понять, как проверить номер версии, если пользователь нажимает кнопку «ОБНОВИТЬ» на веб-странице с измененными данными.

Пожалуйста, дайте мне знать, если вам нужно больше разъяснений.


person Meow    schedule 05.01.2011    source источник
comment
Если эти данные идентифицируют пользователя, то как они могут быть изменены кем-то другим без его ведома? И если он изменил данные в другом экземпляре браузера, а затем сохранил этот экземпляр, то не должен ли он перезаписать то, что было сохранено ранее?   -  person Luciano    schedule 05.01.2011
comment
@Luciano: Если я правильно понимаю вашу точку зрения ... версия, отправленная клиенту, не будет редактируемой, или я могу поместить ее в скрытое поле и т. д., значение версии не будет идентифицировать самого пользователя, это помогает увидеть, есть ли та же запись был обновлен другими пользователями, такими как ... ну админ??   -  person Meow    schedule 05.01.2011
comment
Если версия остается скрытой в чем-то вроде переменной javascript, пользователь может изменить ее перед отправкой сообщения обратно на сервер. Я думаю, что было бы лучше сохранить объект пользователя в сеансе сервера, а затем изменить этот объект с тем, что возвращается из браузера, без изменения номера версии, а затем сохранить/объединить этот объект.   -  person Luciano    schedule 05.01.2011
comment
@Luciano: Это хороший момент. На самом деле я забыл упомянуть, что использую REST, поэтому он должен быть без гражданства (т.е. я не могу использовать сеанс).   -  person Meow    schedule 05.01.2011


Ответы (1)


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

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

Это означает, что значение поля версии также отправляется обратно клиенту, даже если клиент (я или кто-либо другой) никогда не будет его использовать.

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

person Thilo    schedule 05.01.2011
comment
Спасибо за совет! Я не решался включить эту дополнительную часть данных (то есть версию), но оказалось, что это действительно важная часть :) - person Meow; 05.01.2011
comment
Мы можем изменить номер версии из внешнего интерфейса (javascript). Тогда как в этом случае будет работать оптимистическая блокировка? - person Rumel; 13.04.2021
comment
Это кооперативная схема, она не работает, если клиент не передает правильный номер версии. Если вы отправите неправильный номер версии, обновление будет либо отклонено, либо вы сможете вслепую переопределить версию, которую не видели. - person Thilo; 13.04.2021