Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Prenotazioni concorrenti

    Ciao a tutti,
    vorrei gestire la prenotazione concorrente dei posti in un cinema mediante php e MySQL.

    Il mio dubbio è inerente il momento in cui effettuare il lock sulla tabella dei posti per evitare che due persone possano contemporaneamente prenotare gli stessi posti.

    Mettiamo che esistano 4 posti disponibili: è indubbio possano avvenire due differenti prenotazioni da due posti ciascuna in contemporanea, mentre non possono avvenire due prenotazioni da 3 posti ciascuna.

    La procedura dovrebbe essere la seguente:
    1. inserimento del numero dei posti desiderati;
    2. inserimento dei propri dati;
    3. pagina di conferma dati inseriti;
    4. pagamento;
    5. invio conferma operazione.

    Se locco la tabella dei posti tra il punto 1 e 2 e la rilascio solo dopo il 5 sto sicuro che non può succedere alcun errore.

    Ma se i posti disponibili sono 50 e io locco tutto per una prenotazione da un posto e tale utente ci mette mezz'ora a finire la procedura.. il sistema non risulta assolutamente efficente, tutti gli altri utenti risultano inutilmente bloccati (tra l'altro ho anche un mancato guadagno).

    Un'altra idea potrebbe essere quella di scalare direttamente il numero dei posti desiderati dal totale disponibile dopo il punto 1 e non loccare la tabella. Se si arriva a fine procedura lascio inalterato il numero di posti disponibili, altrimenti lo reincremento.
    Ma come fa il sistema a capire che la prenotazione non è stata completata se l'utente non clicca su annulla ma chiude direttamente il browser?

    Confido in un aiuto o in una indicazione di qlke link dal quale scaricare slide, manuali, ecc..

    Ciao e grazie!

  2. #2

  3. #3
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    I problemi di concorrenza sono tra i peggiori in assoluto, questo si sa, e spesso si corre il rischio di credere di aver trovato una soluzione salvo poi trovarti il programma che inspiegabilmente sbaglia.

    E' cosa nota che qualche anno fa un programmatore sbagliò la programmazione concorrente di un apparecchio per radiazioni a scopo medicale -- al tempo non so nemmeno se esistessero i semafori, si parla di anni addietro.

    Una persona morì....

    Comunque,

    Ma se i posti disponibili sono 50 e io locco tutto per una prenotazione da un posto e tale utente ci mette mezz'ora a finire la procedura.. il sistema non risulta assolutamente efficente, tutti gli altri utenti risultano inutilmente bloccati (tra l'altro ho anche un mancato guadagno).
    Pensa poi se l'utente chiude il browser

    Un'altra idea potrebbe essere quella di scalare direttamente il numero dei posti desiderati dal totale disponibile dopo il punto 1 e non loccare la tabella. Se si arriva a fine procedura lascio inalterato il numero di posti disponibili, altrimenti lo reincremento.
    Ottimo, in passato ho fatto anch'io cosa simile, solo che nel mio caso era più azzeccato in quanto i numeri persi non importavano un fico secco.

    Ma come fa il sistema a capire che la prenotazione non è stata completata se l'utente non clicca su annulla ma chiude direttamente il browser?
    Via sessione; io darei cmq un tempo limite, dopo di che procederei a reincrementarei posti.

    E' una prima mia idea, magari ragionando assieme può esserci una soluzione di gran lunga migliore. D'acchitto mi viene questa.

    [.:: JaguarXF ::.]
    __________________

  4. #4
    Sai.. teoricamente io ste cose le dovrei sapere perchè le ho pure studiate... però tra le mille opportunità vorrei riuscire a trovare quella più adatta ad una situazione di questo genere..

    Sostanzialmente quindi la soluzione migliore dovrebbe essere la seguente:

    0. faccio partire la sessione;
    1. inserimento del numero dei posti desiderati;
    1.1 se c'è abbastanza disponibilità decremento subito dal numero totale dei posti liberi;
    2. inserimento dei propri dati;
    3. pagina di conferma dati inseriti;
    4. pagamento;
    5. invio conferma operazione.

    Se sono arrivato al punto [5] il sistema sà che il numero totale dei posti liberi è corretto.
    Se ho abbandonato la procedura prima di arrivare al punto [5] allora il sistema deve reincrementare la disponibilità dei posti.

    A questo punto però ci dovrà essere un sistema che periodicamente valuta le prenotazioni ritenute in corso e se la sessione a loro associata è scaduta le elimina e riporta in una situazione consistente la disponibilità.
    Supponendo di avere un server php con che tecnologia posso creare questo sistema? Di certo non può essere una pagina php in quanto questa deve essere richiamata ma deve essere un sistema autonomo.

    Che ne pensi?


  5. #5
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    Supponendo di avere un server php con che tecnologia posso creare questo sistema? Di certo non può essere una pagina php in quanto questa deve essere richiamata ma deve essere un sistema autonomo.
    Beh.. e perchè non fai così:

    -1. ogni script inizialmente valuta le prenotazioni ritenute in corso e se la sessione a loro associata è scaduta le elimina e riporta in una situazione consistente la disponibilità;
    0. faccio partire la sessione;
    1. inserimento del numero dei posti desiderati;
    1.1 se c'è abbastanza disponibilità decremento subito dal numero totale dei posti liberi;
    2. inserimento dei propri dati;
    3. pagina di conferma dati inseriti;
    4. pagamento;
    5. invio conferma operazione.

    Così non hai bisogno di demoni vari. Poni solo attenzione a non incrementare i posti n volte, basta un flag sul db a tal proposito.

    Solo una nota.

    Sul mio sistema, con la mia versione di PHP, coi miei settaggi e col mio programma ho notato che MySQL fatica a discriminare query di lettura/scrittura perfettamente uguali nell'arco di <1 sec.

    Solo per dire.. più controlli fai meglio è.




    [.:: JaguarXF ::.]
    __________________

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.