Xpoint
   [напомнить пароль]

Блокировки про многопользовательском доступе

Метки: [без меток]
2006-07-06 10:59:34 [обр] wiktar(0/20)[досье]

Размышляю над правильной огранизации многопользовательской работы в Системе Управления Сайтом.

Сайт - это материалы (статьи), разгруппированные по категориям.
Доступ имеют много пользователей разного ранга (root, администраторы отдельных разделов, пользователи форума...).

Разграничение доступа осуществаляется по проверки имеет ли данный пользователь право на чтение/запись в данный раздел/страницу.

Но вот в чём вопрос:
Как правильно разрулить ситуацию, когда два разных администратора без согласования друг с другом, начинают редактировать одну и ту же страницу?

Или, например, один администратор редактирует страницу, а другой в это время удаляет её?

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

Здесь тоже появляется немало вопросов: как избежать недружелюбной блокировки "плохими" пользователями, как проверять, подключен ли ещё пользователь...

Какие есть ещё варианты? Спасибо!

спустя 1 час 59 минут [обр] Thirteensmay(0/157)[досье]
Интересная тема ;), сам такой. Можно двигаться в разных направлениях. Первое что приходит в голову это конечно блокировка, но тут есть проблемы: 1) Ограничение одновременного доступа, 2) Снятие блокировок. И самое неприятное здесь конечно "Ограничение доступа", ну что же это за многопользовательская система если я как админ не могу чтото сделать. Можно пойти другим путем (я чаще поступаю так): В общем случае все сводится к 2 предметным операциям, UPDATE/INSERT и DELETE, блокировки не используются. В этом случае получается чтото типа "очередей с корректируемыми косяками", т.е. актуален только последний UPDATE, DELETE происходит независимо, UPDATE после DELETE ессно не проходит. (Упрощено). Это просто, потому что фактически оно так само по себе получается, но тоже конечно есть проблемы, точнее одна: Пользователь не всегда получает то что ожидает. Это может показаться неприемлемым, однако не спешите делать выводы. Вопервых как уже было сказано, это ПРОСТО, во вторых, отстутствуют проблемы варианта с блокировками (проблемы доступа), производительность опять таки. Далее, я бы сказал что "неоправдание ожиданий" с точки зрения многопользовательской системы даже более логично чем отсутствие доступа, хотя спорно конечно, но Вы же не удивляетесь когда ночью подходите к холодильнику чтобы кефира попить, и обнаруживаете что ктото из Ваших домочадцев его уже того. Есть 2 варианта, заныкать его под подушку (заблокировать), либо уведомить окружающих о том что Вы о них думаете. Какой вариант более многопользовательский ;) ? "Очереди с корректируемыми косяками" подразумевают что при выполнении какой либо операции учитывается окружающая обстановка, т.е. каждую операцию приходится внимательно продумывать, и вполне возможно корректировать возможные косяки, хотя часто если подумать даже этого можно избежать, таким образом большинство проблем "неоправдания ожиданий" можно компенсировать. Пользователь должен привыкнуть к тому что он работает не один а в команде, и если он изменил какой либо документ, а потом зашел, смотрит на него, и видит не совсем то что ожидал, это его не должно удивлять, служба логирования помогает кстати хорошо. В реальных проектах ессно ищется золотая середина, т.е. оба подхода комбинируются, я в основном использую второй, а в особо критических случаях (их очень мало) - первый. Если же сравнивать эти два варианта по отдельности, то скажем так: Первый (блокировки) - более надежен и прогнозируем, но не совсем "многопользователен", Второй (не знаю как назвать) - с точки зрения многопользовательности куда лучше (почти идеален), но вызывает возгласы "А куда это делся мой документ ?" и пр. т.е. не оправдывает собственнические ожидания пользователей. Что имеем в результате ? - комбинируем, т.е. в процессе разработки ИС определяем критичные участки и реализкем соответствующий их специфике подход.
спустя 2 часа 46 минут [обр] Thirteensmay(0/157)[досье]

Да, это я конечно в общем потеоретизировал ;) на тему "Какие есть ещё варианты ?", что же касается ответов на конкретные вопросы, так вон они, под ногами (ОС, Office...). Вот собственно возможные варианты решения Ваших конкретных вопросов:

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

1. Блокировать доступ на запись для второго, выдавать уведомления, доступ на чтение не блокировать.

  1. Никак, кто последний запостил, тот и папа.
Или, например, один администратор редактирует страницу, а другой в это время удаляет её ?

1. Проверять перед удалением редактируемость ресурса. Выдавать уведомления, блокировать удаление.

  1. Не суетиться, пусть удаляет, последующий update не будет иметь смысла. В крайнем случае при апдейте можно сказать что ресурс был удален темто темто, тогдато,, "Cоздать заново ?" ;)
Как избежать недружелюбной блокировки "плохими" пользователями ?

1. Блокировать "плохих" пользователей.

  1. Никак, у кого первого терпение закончится тот этот вопрос и решит.
Как проверять, подключен ли ещё пользователь ?

1. По факту его выхода/таймауту.

  1. Повесить ему "бомбилку" на основе xmlHTTPRequest.

Вы хотите идеологически правильного решения ? - не бывает. Все зависит от конкретных условий, в частности от соотношения юзабилити/лени разработчика ;)

Powered by POEM™ Engine Copyright © 2002-2005