2009-03-30 17 views
8

Ho un modulo che si estende su più pagine. Il modo in cui è impostato ora non è l'ideale perché salva (nel database) ogni pagina quando viene inviata. Quindi se l'utente non completa il modulo su tutte le pagine ci sarebbe una registrazione utente incompleta salvata nel database.È possibile che le transazioni di un database si estendano su più richieste nelle rotaie?

Vorrei salvare i salvataggi se l'utente non riempie completamente il modulo.

Quindi c'è un modo per impostare una transazione che dovrebbe iniziare quando l'utente compila il primo modulo e termina quando l'utente finisce sull'ultima pagina?

risposta

1

Non conosco la risposta alla tua domanda originale, ma comunque ...

Invece di risparmio su ogni pagina, perché non salvare tutti i dati in una variabile di sessione? Quindi alla fine puoi avere una pagina che salva i dati in sessione fino al database? In questo modo non hai mai salvato parzialmente nulla nel DB.

1

Penso che ci sia un valore nel salvare ogni pagina, perché se si tratta di un processo di lunga durata e l'utente è interrotto nel mezzo, potrebbe voler salvare i risultati intermedi e non impegnati e riprendere da dove si erano interrotti in seguito.

Se pensi che sia anche una buona idea, il tuo progetto memorizzerebbe un flag per indicare se un particolare pezzo faceva parte di una transazione di lunga durata che non era ancora completa. Imposta la bandiera quando il pezzo finale è stato completato e il pulsante Salva è stato premuto. Dare un valore di timeout che direbbe se ai pezzi intermedi è stata data l'approvazione di "salvataggio finale" dopo un certo periodo di tempo in cui sarebbero stati eliminati.

1

L'apertura di una transazione di database che comprende più richieste è una cattiva idea. Considerare la situazione in cui un utente chiude il browser prima che la transazione venga eseguita. Ti rimane una transazione orfana che non è né rollbackback né commit.

Basta inserire un flag nel database come REG_COMPLETE, che viene impostato solo sull'ultima pagina del processo di registrazione. Quindi puoi filtrare/sfregare/quello che vuoi con quel record incompleto ... magari mandare loro una e-mail che li richiede di finire?

2

Per rispondere alla domanda specifica, non penso che ci sia un modo per impostare una transazione nel database senso che farà quello che vuoi. Pensaci e vedrai perché: non c'è alcuna garanzia che le varie parti della tua operazione su più pagine vengano gestite con lo stesso processo. O probabilmente anche lo stesso server. Se la richiesta si estende su connessioni al database, come in questa situazione, le parti non vincolate da una connessione saranno invisibili alle altre connessioni.

Così come le idee già menzionate, prenderei in considerazione l'utilizzo di una o più tabelle di "staging" per contenere i dati incompleti già inseriti. Quindi, quando l'utente ha terminato, una singola transazione può applicare i dati alle tabelle permanenti e rimuovere i dati di staging. I dati incompleti possono essere cancellati su un criterio di età mediante un processo in background una volta che si è certi che la sessione è stata interrotta o mantenuta fino a quando l'utente non ritorna, nel caso ciò risponda meglio alle proprie esigenze.

Mi piacerebbe attenermi a questo approccio in particolare se mi aspetto di avere regolari transazioni incomplete, perché in questo modo non devo gestire dati incompleti nei miei modelli principali.

Problemi correlati