Конфликт обновления данных - PullRequest
1 голос
/ 20 августа 2010

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

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

Есть предложения как решить эту проблему? В настоящее время я просто работаю с текстовыми файлами.

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

В настоящее время я просто работаю с простыми текстовыми файлами.

Предложение 1. Используйте базу данных.

Предложение 2. Используйте файл блокировки.Используйте вызовы API уровня OS, чтобы открыть файл с эксклюзивной блокировкой.Первый пользователь, получивший этот файл, имеет эксклюзивный доступ к данным.Когда этот пользователь завершит транзакцию, закройте файл и снимите блокировку на уровне ОС.

Предложение 3. Не «обновляйте» файл.Журнал истории изменений.Затем вы можете прочитать имена пользователей и временные метки из журнала, чтобы найти последнюю версию.

Если вы делаете это, вам нужно, чтобы каждый запрос делал что-то вроде этого.

  1. При получении текущего состояния прочитайте последнюю строку из файла.Кроме того, получите размер файла и время последней модификации.Сохраните размер и время последнего изменения в сеансе.Отобразите текущее состояние в форме.

  2. Когда обрабатывается изменение пользователя, проверьте размер файла и время последнего изменения.Если файл отличается от того, что был записан в сеансе, этот пользователь пытается обновить данные, которые были изменены кем-то другим.Прочитайте последнюю строку из файла.Кроме того, получите размер файла и время последней модификации.Сохраните размер и время последнего изменения в сеансе.Отобразите текущее состояние в форме.

Кроме того, вам может потребоваться два файла.Один с «текущими» данными, другой с историей изменений.Это может ускорить поиск текущих данных, поскольку это единственная запись в файле текущего состояния.

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

1 голос
/ 20 августа 2010

При сохранении новых данных вы можете сравнить дату изменения данных со временем, когда пользователь начал редактирование.

Если были изменения, когда пользователь вносил изменения, вы могли бы затем показать сообщениепользователя и спросите, какую версию взять, или разрешите ему объединить две версии.

Эта проблема была решена такими же системами ревизий, как svn, git и т. д.

0 голосов
/ 20 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...