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