Ну, у вас есть несколько проблем.
На базовом уровне это "легко". Просто используйте классические методы транзакционной обработки, чтобы сохранить номера акций и строки ввода заказов относительно запасов. Если у вас есть 10 доступных, а кто-то заказывает 1, то зафиксируйте позицию с количеством 1, в то время как вы увеличиваете «зафиксированное» количество на предмете инвентаря. Когда вы отправляете предмет, удалите один из На складе, а другой из Совершенных. В наличии - совершено = доступно.
Итак:
In Stock Committed Available
Before: 10 0 10
Ordered: 10 1 9
Shipped: 9 0 9
Недостатком является использование нескольких блокировок, которые могут повлиять на параллелизм. В зависимости от вашего трафика это может или не может быть проблемой. Затем вы работаете на лету, подсчитывая заказанные предметы по сравнению с запасом, и в итоге вы получаете условия гонки. Но на самом деле это просто факт жизни в бизнесе.
Но, в любом случае, независимо от того, как вы фиксируете запись в своей базе данных, это не означает, что предмет действительно будет поставляться.
Номер на складе может быть просто неверным. Это могло быть неправильно использовано, склад может быть поврежден, «усадка сотрудника» и т. Д. Все может пойти не так. Таким образом, любое обязательство перед клиентом, которое вы фактически отправите, то, что вы обещали, должно иметь этот маленький * рядом с ним в качестве отказа от ответственности.
Затем вы переходите ко всем вопросам обратного заказа, отмены и исполнения.