Как не списать дважды за одну кнопку

Wait 5 sec.

Между нажатием кнопки и результатом у нас проходит от трёх до шестидесяти секунд: очередь, воркер, внешний API, иногда таймаут. А снаружи — пользователь, у которого на счету ровно одна генерация, и палец, который очень хочет нажать ещё раз.Разбираю двухфазное списание: резерв при постановке в очередь, списание ровно зарезервированного при успехе, удаление строки при провале. Плюс мьютекс на пользователя через UNIQUE-индекс, почему цену нельзя пересчитывать при списании, что делать с резервами от умерших воркеров и зачем суточные лимиты обновлять скользящим окном, а не кроном в полночь. Читать далее