Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    InnoDB, transazioni ed ajax

    Ciao ragazzi,
    ho bisogno di una mano su un problema urgentissimo!

    Sto realizzando un'applicazione web nella quale la gente può prenotare una data/ora.

    Devo per forza utilizzare le transazioni di InnoDB ma ho un problema con ajax.

    A quanto ho capito la tranazione è visibile solo dalla connessione che la genera finché non si da un COMMIT...

    Il mio problema è che con il file prenotazioni.php avvio la transazione, poi con il file avanti.php richiamato in ajax devo aggiungere o modificare una riga in transazione, ma ovviamente includendo di nuovo la chiamata alla connessione al db per il file avanti.php, la connessione è diversa da quella iniziale nel file prenotazioni.php e quindi non mi vede la transazione...

    C'è un modo per far comunicare che è sempre la stessa connessione al db??

  2. #2
    Vi spiego il mio problema di base...

    siccome le date possono essere prenotate da piu gente contemporaneamente il dilemma è questo:

    1. faccio salvare la data nel db non appena viene scelta, cosi quelli che vengono dopo la trovano occupata.
    PROBLEMA: Se all'utente che sceglie la data gli si riavvia il pc, quella data mi risulta prenotata invece dovrebbe scomparire.

    2. Uso le transazioni, cosi se si riavvia il pc non mi salva nulla perché non ho fatto COMMIT, ma in questocaso finché non completo la transazione con COMMIT chiunque alla fine del processo mi può anticipare e prendere la data... e la scelta della data purtroppo devo per forza mostrarla ad inizio del processo... finché la gente mi completa i campi nome, cognome ecc... a voglia ad anticiparmi...

    Come posso risolvere? Mi servirebbe una specie transazione che TUTTI VEDONO, ma che sparisce se alla chiusura della connessione non si da un COMMIT.

  3. #3
    le transazioni si usano all'interno della stassa connessione con il db.
    termnata l'esecuzione del file php viene chiusa automaticamente la connessione con il db e liberata la memoria.

    a te non servono le transazioni ma gestire in maniera più opportuna la collisione delle prenotazioni.

    pensa ad un modo di blocco della data per un intervallo temporale definito, se non viene chiusa la prenotazione, allora liberi quella data.
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  4. #4
    Il problema è che per ogni data/ora ci possono essere anche 4 "posti" liberi sempre alla stessa ora dello stesso giorno... Quindi non posso bloccare per data, ed inoltre se mi si riavvia il pc, la riga creata precedentemente rimane salvata (o se salvo tutto alla fine, quando vado per salvare alla fine può darsi che io sia stato preceduto e mi tocca rifare tutto da capo).

    L'unica idea che mi è venuta ora è salvare nel db le sessioni, e controllare sempre che la connessione sia attiva (ovvero che l'utente sia connesso) e se non c'è, elimino tale riga...

  5. #5
    Puoi aggiungere un flag alla tabella che valorizzi nel momento in cui un utente seleziona una determinata data e che poi rimuoverai al termine della prenotazione. Se un altro utente cerca di selezionare la stessa data in caso il flag sia impostato, da meno di un certo tempo massimo, puoi visualizzare un messaggio in cui spacifichi che tale data è in uso da un altro utente, ma non necessariamente indisponibile.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  6. #6
    Originariamente inviato da satifal
    Puoi aggiungere un flag alla tabella che valorizzi nel momento in cui un utente seleziona una determinata data e che poi rimuoverai al termine della prenotazione. Se un altro utente cerca di selezionare la stessa data in caso il flag sia impostato, da meno di un certo tempo massimo, puoi visualizzare un messaggio in cui spacifichi che tale data è in uso da un altro utente, ma non necessariamente indisponibile.
    Il problema è che ci possono essere utenti che si addormentano al pc occupandomi il posto... in che significa che non posso buttare fuori una persona solo perché non è stata rapida, visto il target "anziano" dell'applicazione...

  7. #7
    Non vedo altre soluzioni se non un qualche tipo di temporizzazione. Tra l'altro è un po' come la gestione degli utenti connessi. Non è possibile individuare immediatamente un utente che si disconnette, a meno che egli non clicchi sul pulsante di logout. Se chiude semplicemente il browser funziona che se non da segni di navigazione per un certo periodo di tempo verrà considerato disconnesso. Imposta un "ragionevole" intervallo di tempo.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Quindi se ho capito bene quello che mi consigli di fare è:

    Impostare una tabella con: id_sessione | timestamp

    Ogni tipo 10 secondi lancio una richiesta ajax (visto che la procedura prima di salvare è lunga) con la quale mi aggiorno il timestamp della sessione dell'utente.

    Associo tramite un campo la sessione alla riga di prenotazione.

    Poi ad ogni accesso (quindi sul file index.php che mi regola tutto) imposto che mi cancelli tutte le righe prenotate NON SALVATE alle quali è associato un id_sessione non presente in tabella o con timestamp maggiore di 2 ore ad esempio.

    Giusto?

  9. #9
    Originariamente inviato da StefanoV
    Ogni tipo 10 secondi lancio una richiesta ajax (visto che la procedura prima di salvare è lunga) con la quale mi aggiorno il timestamp della sessione dell'utente.
    Credo tu possa evitare questa procedura ottimizzando così gli accessi. Secondo me ti basta salvare il timestamp iniziale (quello al momento dell'inizio della procedura di prenotazione) senza la necessità di aggiornarlo. Ogni qualvolta un altro utente tenta di selezionare quella data/ora verifichi sul DB la presenza o meno del timestamp. Se esso non è valorizzato allora lo valorizzi ed inizia la procedura in caso contrario lo confronti con la data/ora attuale e se è passato più di un tot tempo (es: 2 ore) significa che la prenotazione precedente non è stata terminata, quindi aggiorni il timestamp edi inizi la procedura con nuovo utente. Se non è ancora trascorso il tempo limite visualizzi un messaggio di cortesia informando l'utente che la data/ora da lui scelta è momentaneamente in uso.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  10. #10
    Grazie mille, proverò in questo modo e ti farò sapere!!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.