Le quantità vanno detratte in fase di checkout e, usando le innodb, puoi usare le transazioni ... come ti è stato già detto
Ma attenzione, non devi fare una transazione per ogni singola detrazione ma piuttosto devi fare un'unica transazione, complessiva, dove effettui TUTTE le detrazioni e, alla fine, lanci una select per assicurarti che non ci siano quantità negative sui prodotti selezionati perché in caso invece di lanciare un commit lanci un rollback ed annulli le detrazioni e, nel contempo, avvisi l'utente
Se vuoi stare più tranquillo, anche se è meno performante, puoi usare il locking delle tabelle, ovviamente non sei più legato alle inno db.
Con il locking fai un lock PRIMA di iniziare le operazioni, poi lanci una select per controllare se ci sono le quantità e se tutto va bene fai le detrazioni e poi l'UNLOCK ... se mancano quantità avvisi l'utente e fai l'unlock.
Con il lock non c'è possibilità che ti ritrovi con quantità negative perché non ci potranno essere più operazioni contemporanee, d'altro canto con le transazioni anche se devi fare più controlli non blocchi niente e quindi le performance sono superiori ed i tempi di esecuzioni minori.
Ovviamente, con le innodb, devi accertarti che il tuo hoster te le fornisca, non tutti lo fanno