Я опираюсь на Оптимистический контроль параллелизма jachguate ответ, чтобы ответить на вопрос, заданный в комментариях.
Я предпочитаю использовать OCC везде, где могу, потому что реализация проще.Я собираюсь поговорить о трехуровневом приложении, использующем инфраструктуру персистентности объекта .Моя предложенная схема имеет три уровня:
контроль уровня строки или объекта, где уникальный идентификатор версии хранится для каждого объекта.Если вы попытаетесь обновить объект, идентификатор версии будет автоматически изменен.Если ваш идентификатор версии не совпадает с тем, что уже есть, ваше обновление завершится неудачно.
блокировка на уровне поля или столбца.Вы отправляете полную копию оригинального объекта, а также обновленную.Каждое поле в вашем обновлении имеет действительные и старые значения, сравниваемые до применения нового значения.Можно попросить пользователя разрешить конфликты, а не отбрасывать их, но это становится грязным по мере увеличения объема данных в коммите.
пессимистическая блокировка.Каждый объект имеет владельца блокировки, который обычно равен нулю (объект не заблокирован).Когда вы хотите редактировать объект, вы сначала блокируете его.Проблема здесь в том, что необходимо привести в порядок блокировки, а деловые правила могут быть ужасными (какой тайм-аут желателен).
Преимущество этого состоит в том, что большую часть временинедорогой путь OCC взят.Для вещей, которые случаются много, но с низкой конкуренцией, выгоды значительны.Подумайте об отслеживании товаров на складе - товары перемещаются все время, но очень редко одинаковые предметы перемещаются одновременно, и когда они это делают, решение легко (количество осталось = оригинал минус мое удаление и ваше удаление).Для сложного случая, когда (скажем) продукт перемещен, вероятно, имеет смысл заблокировать продукт, пока он находится в пути (потому что это отражает физическую ситуацию).
Когда вам приходится возвращаться к блокировке, эточасто полезно иметь возможность уведомлять обоих пользователей и иметь канал связи.По крайней мере, уведомите пользователя, который хочет блокировку, когда она будет доступна, предпочтительно разрешите ему отправить сообщение держателю блокировки и, возможно, даже разрешите ему принудительно установить блокировку.Затем уведомите проигравшего о том, что «Джо Смит взял вашу блокировку, вы потеряете свои изменения».Позвольте офисной политике разобраться в этом:)
Я обычно управляю процессом отката с помощью жалоб пользователей, а не отчетов об ошибках.Если пользователи жалуются на то, что они слишком часто теряют свои правки в конкретном процессе, измените его.Если пользователи жалуются на то, что записи блокируются слишком часто, вам придется реорганизовать сопоставления объектов, чтобы увеличить степень детализации блокировки или внести изменения в бизнес-процессы.