Ho poco tempo per scriverti codice, ma ti spiego per blocchi come intenderei io questo procedimento.
Un utente vuole vedere cosa c'è in catalogo => query al DB ufficiale estrapoli la quantità disponibile per quell'oggetto.
Con quella quantità vai a popolare il DB di appoggio che dovrà avere (tra gli altri) i seguenti campi:
Perché ho messo questi campi come fondamentali.codice:» identificativo_item » quantita_in_magazzino » quantita_richiesta » data_richiesta » metodo_di_pagamento
Se un secondo utente visualizza e basta il catalogo, è giusto che gli si mostri la quantità disponibile per ogni oggetto (query alla tabella ufficiale).
Se però vuole acquistarne uno (o più) filtri la disponibilità in base al metodo di pagamento scelto dall'utente che ha già fatto un acquisto (query alla tabella di appoggio).
Nel caso il primo utente abbia pagato PayPal o Carta di Credito, quindi istantaneamente, aggiorni direttamente la tabella ufficiale con le nuove quantità (ed il secondo saprà già) il numero di pezzi disponibili.
In caso il primo utente voglia pagare con bollettino postale, con bonifico o che so io, attendi che la transazione del primo utente si risolva in un modo o nell'altro, ed al secondo utente mandi un messaggio di "disponibile a giorni".
Così, se la prima transazione in coda va a buon fine il secondo cliente sa già che deve attendere qualche giorno.
Se la prima trattativa non si conclude dopo un periodo x (nel caso del bonifico 5 giorni), puoi tranquillamente cancellare la trattativa in sospeso e procedere con la seconda.
Ad ogni modo, ogni volta che concludi una trattativa, vai ad aggiornare il DB ufficiale delle quantità.
Forse è un po' macchinoso come metodo, ma lo trovo un meccanismo chiaro e trasparente per gli utenti di questo sito di e-commerce.
Se poi nel sito metti in qualche modo le policy di vendita, ogni utente sa come ragiona il venditore e decide autonomamente se quelle regole gli vanno bene o meno.
![]()