Re[10]: Блокировки в бизнес-слое
От: Poul_Ko Казахстан  
Дата: 28.09.17 04:28
Оценка:
Здравствуйте, ·, Вы писали:

·>Или я тебя совсем не понимаю, или ты не ту цель пытаешься достигнуть. Цель не добиться "одновременности" (что это вообще значит?!), а создать согласованное состояние, установить причинность событий.

Не пытаюсь добиться одновременности, а наоборот, пытаюсь от неё избавиться, так как она порождает проблемы.
Способов избавления пока вижу два — либо всегда всё жёстко делать последовательно, либо на каких-то блокировках не давать делать одновременно некоторые операции.

P_K>>·> Любые последующие изменения цены "официально" считаются, что произошли после, а значит не должны влиять на заказ.

P_K>>Категорически нет. Смотрите выше — изменение цены после приводит к пересчёту неподтверждённых заказов!
·>1. Создать неподтверждённый заказ товара по ценам из справочника.
·>2. Показать заказ клиенту, клиент шлёт команду "подтвердить".
·>3. Сверяем цены в заказе с ценами в справочнике
·>4.1 Цены равны — ставим статус "подтверждён"
·>4.2 Цены не равны — возвратить клиенту ошибку, пересчитать заказ с учётом новых цен и goto 2.
·>Т.е. по сути у тебя тут распределённая система из двух компонент — клиент и сервер — они и должны согласовываться.
Нет, это не соответствует действительности.
У клиента одно действие — создать новый неподтверждённый заказ. Этот заказ создаётся и болтается в системе пока его не подтвердят или не отменят. И пока он болтается неподтверждённый цена в нём всегда должна строго соответствовать цене из справочника.
Вполне допустимо, что перед созданием нового неподтверждённого заказа на экране юзер видел одну цену, а после создания она стала другой. Это нормальный кейс, здесь никакой оптимистической блокировки не нужно. Да даже если бы она была, это бы не изменило ситуацию в корне.
Подтверждение заказа — это другое действие клиента, там тоже могут быть похожие проблемы, но об этом сейчас не будем.
Brainbench transcript #6370594
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.