Re[4]: Блокировки в бизнес-слое
От: Poul_Ko Казахстан  
Дата: 27.09.17 14:21
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Общего решения нет, если есть конкретный пример — можно рассмотреть.


Типичный пример был озвучен в ветке общения с тов. Qulac.
Итак, есть бизнес-операция "Создать заказ". Заказ для какого-то клиента на какой-то товар из справочника. Клиент имеет какую-то свою скидку, товар в справочнике имеет какую-то цену.
Бизнес-правило: при создании заказа брать скидку клиента и применять её к текущей цене товара в справочнике.
Далее, заказ может находиться в состоянии "неподтверждён" и "подтверждён". Создаётся он в состоянии "неподтверждён".
Бизнес-требования: при изменении скидки клиента необходимо пересчитать стоимость всех его заказов в статусе "неподтверждён". При изменении цены товара в справочнике необходимо пересчитать стоимость всех заказов в статусе "неподтверждён", в которые входит этот товар.
Концептуально состояние сущности "заказ" зависит от состояния связанных сущностей "клиент" и "товар".
Вернёмся к операции создания заказа. Как она реализована в коде: нашли клиента, нашли товар, посчитали стоимость, создали и сохранили сущность заказа.
Вроде всё хорошо, но представим что параллельно выполняется, скажем, изменение цены товара. Транзакции идут параллельно: первая прочитала товар со старой ценой и сохранила заказ с ней, вторая обновила цену в справочнике, но не увидела ещё не созданный заказ. В итоге имеем заказ со старой ценой. Бизнес-правила нарушены.

Каковы будут ваши варианты решения?

Данный пример очень упрощён, на самом деле факторов много и варианты их влияния бывают самыми разными (например, наличие у клиента другого неподтверждённого заказа запрещает создавать новый).
Brainbench transcript #6370594
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.