Эффективно проверить, что данные на странице не были изменены кем-то еще с момента загрузки? - PullRequest
0 голосов
/ 08 мая 2019

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

Были некоторые конфликты, когда два пользователя загружали запись примерно в одно и то же время, один вносил изменения, а затем другой вносил ряд изменений. Когда они сохраняются, они не знают, что кто-то еще сделал изменение и, возможно, только что нарушил внесенное изменение или переписал его.

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

Мне интересно, есть ли лучший способ проверить эту проблему? Некоторые идеи у меня были

  • Предоставить как «текущие» данные, имеющиеся в поле, так и «оригинальные» данные. Затем проверьте, какие из них изменены, и сравните их в базе данных, чтобы увидеть, отличаются ли значения по умолчанию от того, что в настоящее время сохраняется. Это бы сработало, но, похоже, наименее благоприятно для производительности.
  • Используйте jquery / javascript, чтобы определить, когда поле было отредактировано, и если оно изменилось с defaultValue, тогда установите скрытое поле, которое будет отправлено, чтобы указать его первоначальное значение. Тогда это будет похоже на предыдущую идею.
  • Установить скрытое поле с отметкой времени, когда пользователь загрузил свою страницу. Когда они отправляют, используйте эту временную отметку и проверьте нашу таблицу истории, чтобы увидеть, были ли какие-либо данные на странице изменены с той отметки времени. Это, кажется, самая эффективная идея и, вероятно, самая простая для реализации.

Есть ли лучшие варианты или лучший способ сделать это? Я чувствую, что я заново изобретаю колесо для общей проблемы.

1 Ответ

2 голосов
/ 08 мая 2019

Вы решаете общую проблему. Но это обычное дело, потому что его нужно многократно решать так часто. «Оптимистичная блокировка записи» - ваш путь вперед. Похоже, что у yii (с которым я не знаком) есть возможности включить обработку этого. Я нашел эту ссылку .

Независимо от того, делает ли инфраструктура yii это для вас, или вам нужно создать ее самостоятельно, вы хотите сделать следующее (для поддержки Optimistic Record Locking):

  1. Создавайте и сохраняйте неизменную копию ваших данных при извлечении их для Клиента.
  2. Клиент должен отправить изменения вместе с неизмененной копией данных обратно на сервер.
  3. Процедура обновления сервера сравнивает неизмененные скопировать в текущую запись (записи). Если что-то изменилось, то оно должно вернуть сообщение об ошибке и «новую» текущую запись.
  4. Если ничего не изменилось, то Сервер выполняет обновление.

Альтернативой является пессимистическая блокировка записи, которую вы можете проверить. Я избегаю этого из-за других проблем, которые у него есть, но есть сценарии, где это более уместно.

...