2010-02-22 3 views
4

Я хочу, чтобы два пользователя случайно перезаписывали друг друга при обновлении записи. То есть два пользователя загружают страницу с записью A на нее. Пользователь один обновляет запись в AB, а пользователь два обновляет ее до AC.Остановить пользователей, переписывающих друг друга

Я не хочу, чтобы последний ударил базу данных, чтобы переопределить ее. Мне нужен механизм, чтобы сказать, что запись была обновлена, чтобы ваши данные не могли быть сохранены.

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

Являются ли эти методы действительными, если это так, что лучше. Если нет, что вы предлагаете. Это в C#, если это делает разницу

Благодаря

+0

Какая у вас "база данных"? Хорошие системы баз данных, как правило, блокируют все реализованные. –

ответ

11

Два метода вы упомянули, эффективно эквивалент - в любом случае у вас есть уникальный идентификатор для «записи во время проверки» эффективно. У меня нет никакого конкретного взгляда на то, что лучше, хотя метка времени, очевидно, дает вам дополнительную выгоду от данных о том, когда запись была действительна.

Альтернатива заключается в том, чтобы помнить, каковы были предыдущие значения, и разрешать обновление только в том случае, если они совпадают - таким образом, если пользователь A начал редактировать запись, тогда пользователь B входит и что-то меняет, а затем изменяет его, пользователь A изменения остаются в силе. (optimistic concurrency control).

+0

Я чувствую себя очень глупым, потому что никогда не имел дело с этим. Иду читать «C# за 24 часа», чтобы увидеть, что еще я пропустил. –

1

Я использую первый вариант. Обновляйте отметку времени при каждом обновлении. Поэтому во время обновления мы проверяем равенство метки времени.

4

Вы описываете оптимистическое блокирование, действующую и полезную технику.

См references here.

5

Существует на самом деле третий способ. Для этого обновления, выполните оператор обновления этой формы:

UPDATE table SET update_field = new_value 
WHERE db_pk = my_pk  // assume primary key immutable 
AND update_field = original_field_value 

где original_field_value является значением поля до обновления было предпринят попыткой. Это обновление не удастся, если кто-то еще изменил update_field, если только они не изменили его на то же значение, которое у вас есть.

2

Любой метод действителен для проверки.

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

Если вы хотите что-то более подробное Google параллелизм - Heres статью, чтобы начать с - concirrency

0

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

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