Имеется сервер, на котором хранятся документы (формат хранения значения не имеет). Пользователям дается возможность создавать новые, редактировать и комментировать существующие документы. При этом пока не существует механизма обеспечения целостности данных. То есть, если два пользователя открыли один и тот же документ, они имеют равное право изменить его и сохранить; причем, естественно, достоверно неизвестно, чье изменение будет последним и в итоге сохранится на сервере. Понятно, что такое положение вещей меня не устраивает.
Первое, что приходит в голову --- блокировать доступ к документу при его открытии пользователем, и разблокировать при закрытии. Однако тут возникает другая проблема: что если пользователь откроет документ, а потом соединение с сетью неожиданно разорвется? Документ останется в <<подвешенном>> состоянии. Идея первая: при повторном открытии документа тем же самым пользователем, что его заблокировал, - разрешать пользователю доступ. (Здесь, правда, не совсем понятно, как справиться со случайным повторным запуском приложения. Поскольку приложение работает в браузере, выяснить, был ли разрыв связи, или случайный второй запуск программы, затруднительно). Идея вторая: с клиентской машины пользователя, открывшего документ, с периодом T посылать <<пинги>> серверу. В случае отсутствия <<пинга>> в течение времени >= kT (k > 1) --- документ разблокировать. При появлении <<пинга>> от того же пользователя --- блокировать вновь, если кто-то уже не заблокировал документ. Если документ уже заблокирован --- сообщать пользователю и мягко просить <<подождать>>
Другая проблема --- неожиданное (аварийное) завершение работы клиентского приложения --- тоже решается при помощи идеи №2.
Замечание: некоторые из редактируемых документов (например, список пользователей) могут редактировать только пользователи-администраторы.
Второе, что приходит в голову --- хранить множество версий одного и того же документа, порождаемых при сохранении данных отдельными пользователями, и впоследствии при необходимости <<сливать>> данные вместе или выбирать предпочтительную модификацию. Причем запрос на выбор можно посылать только если документ был сохранен несколькими пользователями с перерывом в t, где t достаточно мало. Даже скорее всего, необходимо хранить не сами версии, а только изменения по сравнению с исходным документом (как делается, например, в системах контроля версий).
Вариант первый, насколько я понимаю, используется MS Office при совместной работе над документом (уведомление об изменении); второй --- всяческими системами контроля версий и wiki.
Особо замечаю, что использовать базу данных для хранения документов, к сожалению, пока не представляется возможным.
Вопросы следующие:
1) Какой из вариантов предпочтительнее, если пользователи могут соединяться с сетью по ненадежным каналам (хотя и не очень часто), а задержки при работе не должны быть слишком большими? Или, может быть, существуют другие, более интересные варианты?
2) Для каждого из вариантов, возможно существуют известные алгоритмы? Если вы с ними знакомы, назовите, пожалуйста.