Re: NHibernate в многопользовательской среде
От: fmiracle  
Дата: 10.08.10 21:18
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Пишу небольшой утиль для управления складом, в системе работает порядка 100 пользователей, кладовщиков, продавцов и т.д. Есть WCF сервис (InstanceContextMode = PerSession), который предоставляет функционал для типовых складских операций, внутри использует NHibernate. Возник вопрос, как сделать блокировки данных при изменении одной и той же записи на складе разными пользователями одновременно. Например кейс: есть на складе 100 полотенец, два продавца одновременно оформляют продажу один на 40, второй на 60, при оформлении продажи у сервиса вызывается метод, что-то типа такого: Sell(Sell value, params SellEntry [ ] entries); возникает вопрос, что будет происходить в NHibernate в случае такой реализации метода Sell (см. ниже). Конкретно интересует как заставить NHibernate кидать исключение и отменять транзакцию при попытке продать товара больше чем есть?


В Nhibernate имеется встроенный механизм оптимистической блокировки. В этом случае для каждой сущности в таблице заводится служебное поле "Version" (название может быть любое). В мэппинге оно указывается как именно поле для хранения версии записи.
Далее сущность считывается, модифицируется и сохраняется.
При сохранении Nhibernate проверяет, что версия в базе та же самая что у сохраняемой сущности и если нет — то выкидывает StaleDataException. Если та же — то сущность сохраняется а version при этом увеличивается на 1.

Соответсвенно, если получил StateDataException на апдейте — значит между тем как ты взял сущность и проверил в ней количество, изменил и сохранил — кто-то успел изменить эту сущность параллельно (например, продал часть товара. Или наоборот — добавил). Значит, надо обновить данные и посмотреть что делать дальше.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.