2009-03-30 13 views
8

Tengo un formulario que abarca varias páginas. La forma en que está configurado ahora no es ideal porque guarda (en la base de datos) cada página cuando se envía. Por lo tanto, si el usuario no completa el formulario en todas las páginas, se registrará un registro de usuario incompleto en la base de datos.¿Es posible que las transacciones de una base de datos abarquen varias solicitudes en los rieles?

Me gustaría 'deshacer' los guardados si el usuario no completa el formulario.

Entonces, ¿hay alguna forma de configurar una transacción que comenzaría cuando el usuario rellene el primer formulario y finalice cuando el usuario finalice en la última página?

Respuesta

1

No sé la respuesta a su pregunta original, pero de todos modos ...

En lugar de guardar en cada página, por qué no guardar todos los datos en una variable de sesión? Entonces, al final, ¿puede tener una página que guarde los datos de la sesión en la base de datos? De esta forma, nunca habrá guardado parcialmente nada en el DB.

1

Creo que hay valor para guardar cada página, porque si se trata de un proceso prolongado y el usuario se ve interrumpido en el medio, es posible que desee guardar sus resultados intermedios no confirmados y continuar donde lo dejaron más tarde.

Si crees que es una buena idea también, entonces tu diseño almacenaría una bandera para indicar si una pieza en particular era parte de una transacción de larga duración que aún no estaba completa. Establezca la bandera cuando finalizó la pieza final y se presionó el botón guardar. Proporcione un valor de tiempo de espera que diga si a las piezas intermedias se les dio la aprobación de "último guardado" después de un cierto período de tiempo en que se eliminarían.

1

Abrir una transacción de base de datos que abarque varias solicitudes es una mala idea. Considere la situación en la que un usuario simplemente cierra el navegador antes de que se haya comprometido su transacción. Se queda con una transacción huérfana que no se ha retrotraído ni comprometido.

Simplemente ponga una marca en la base de datos algo así como REG_COMPLETE, que solo se establece en la última página del proceso de registro. Luego puedes filtrar/fregar/lo que quieras con ese registro incompleto ... ¿tal vez enviarles un correo electrónico pidiéndoles que terminen?

2

Para responder a la pregunta específica, no creo que haya ninguna forma de configurar una transacción en el sentido de la base de datos que haga lo que desee. Piénselo y verá por qué: no hay garantía de que las diversas partes de su operación de varias páginas se manejen con el mismo proceso. O muy probablemente incluso el mismo servidor. Si la solicitud abarca las conexiones de la base de datos, como ocurrirá en esta situación, las partes no confirmadas de una conexión serán invisibles para las otras conexiones.

Además de las ideas ya mencionadas, consideraría utilizar una o más tablas de "etapas" para contener los datos incompletos ya ingresados. Luego, cuando el usuario finaliza, una sola transacción puede aplicar los datos a las tablas permanentes y eliminar los datos intermedios. Los datos incompletos se pueden borrar en un criterio de edad mediante un proceso en segundo plano una vez que está seguro de que la sesión se ha terminado o retenido hasta que el usuario regrese, en caso de que cumpliera mejor con sus requisitos.

Me inclino por este enfoque, especialmente si esperaba tener transacciones regulares incompletas, porque de esta manera no tengo que lidiar con datos incompletos en mis modelos principales.

Cuestiones relacionadas