Premettendo che non ho mai affrontato la questione a livello professionale, io farei una roba del genere: usando se vuoi anche il BEGIN-COMMIT-ROLLBACK quando l'utente inizia la procedura di pagamento della transazione, in qualche modo bloccherei momentaneamente l'acquisto di quella merce (magari con un flag sul database del magazzino) in attesa dell'esito della transazione. Se questa e' positiva, scali la quantita' dal magazzino e poi sblocchi la merce.

In questo modo se due utenti contemporaneamente stanno acquistando un oggetto, il primo che avviera' la procedura di transazione e pagamento mettera' in "standby" la merce che sta acquistando, cosi' l'altro utente, qualora stesse acquistando la medesima merce, dovra' attendere prima la chiusura della prima transazione.

Dovrai mettere anche una specie di timeout sulla transazione, in modo che il secondo utente non debba attendere un quarto d'ora i comodi del primo utente. Ad ogni modo, se si tratta con le quantita', secondo me e' fondamentale fare in modo che, sulla medesima merce, avvenga una transazione per volta.
Volendo affinare le cose potresti far avvenire il blocco della merce solo se l'utente in questione ordina un quantitativo di merce che supera la giacenza "virtuale" per quell'oggetto. Nel senso che se un utente ordina 2 oggetti, nel magazzino ce ne sono 10, e l'altro utente ne ordina 3, non c'e' motivo di bloccare la transazione a questo secondo utente, perche' "virtualmente" anche se il primo utente compra gli oggetti che ha messo nel carrello, c'e' sufficiente disponibilita' anche per il secondo.

Fossi in te pero' attenderei il commento di qualcuno che ha gia' esperienza professionale in tal senso, vista la delicatezza della questione. Nel frattempo spero comuqnue di averti dato qualche spunto di riflessione o idea. ^_^