Можно использовать оптимистичную блокировку вида
Либо делать SELECT * from items where id = :item_id FOR UPDATE в рамках транзакции, чтобы заблокировать конкретную строку.Посмотрю про эту блокировку, спасибо.
чтобы вычисление нового количества произошло также атомарно.Вот этот вариант должен быть простой и рабочий, почему то мне в голову не пришла такая простая идея.
потом уже отдельно считать агрегированное значениев этом решении смущает, что каждый раз, при просмотре остатков складов, нужно прочитать все строки в таблице, для агрегации.
Думаю, купить б/у контроллер будет дешевле чем качественный самосбор под схд, а само главно - надежней
Тут нужно боросться не со следствием а с причиной
Бэкапилка, если только не "горячая" должна находиться как можно дальше от основы