2008-10-03 3 views
2

У меня вопрос о блокировке. Это не должно касаться только блокировки записей, но в любом случае.Что для меня лучше всего подходит для блокировки записи?

Предположим, я пишу веб-доступную CMS. Я борюсь с некоторыми идеями.

В тот момент, когда пользователь открывает статью для редактирования, отметьте статью как «используемую». Все идет нормально.

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

Механизм тайм-аута приходит на ум, но сколько времени требуется, чтобы написать статью? 10 минут слишком короткие, 30 минут слишком длинные.

Возможно, я слишком усложняю это. Я хотел бы услышать ваши мысли по этому вопросу.

ответ

2

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

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

+0

При условии, что ваш алгоритм слияния звучит, копирование/изменение/слияние обычно намного меньше хлопот и беспокойства, чем блокировка/редактирование/разблокировка. – Rob 2008-10-10 22:21:28

2

Мое голосование за optimistic locking, где это возможно.

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

0

Используйте rowversion для mssql 2005 и выше, временную метку для mssql 2000 и ниже. Используйте скрытое поле xmin для postgresql.

Позвольте всем другим пользователям открыть отчет. Наряду с сохранением записи тег, который сохранил его, и с помощью rowversion, в catch (DbConcurrencyException) повторно выложил ошибку, которая указывает другим пользователям, которые сохранили запись, прежде чем они это сделают, и попросите их повторно открыть запись чтобы просмотреть изменения, сделанные пользователем, который первым сохранил запись.

Смежные вопросы