2009-11-06 12 views
6

Estoy implementando un botón Deshacer para una operación prolongada en una aplicación web. Como el deshacer vendrá en otra solicitud, tengo que comprometer la operación.¿Cómo deshago una transacción que ya se ha comprometido?

¿Hay alguna manera de dar una pista sobre la transacción como "quizás deshacer"? Entonces, después de que la transacción se haya comprometido, aún podría revertir en otros procesos si fuera necesario.

De lo contrario, la función Deshacer será tan compleja como la operación que está deshaciendo.

¿Esto es posible? ¡Otras ideas bienvenidas!

+0

¿Habrá dependencias de datos en la información que ha confirmado? –

+0

Solo con claves externas y datos secundarios. Esos también deberían eliminarse, por supuesto. pero la operación es atómica y una reversión haría con seguridad lo correcto. –

Respuesta

4

La idea en este caso es registrar cada operación: una operación de contador que haga lo contrario, en un registro especial y cuando necesite deshacer, ejecute realmente los comandos que ha registrado.

algunas bases de datos tienen tecnología de flashback que puede solicitar al DB para volver a cierta fecha y hora. pero es necesario entender cómo funciona, y asegúrese de que sólo afectará a los datos que desea y no otro personal ...

Oracle Flashback

No creo que hay una tecnología similar en el servidor SQL y hay una respuesta SO que dice que no, pero SQL sigue evolucionando ...

+0

Si el evento no ocurrió hace mucho tiempo, puede usar herramientas de Log PI o Apex SQL (Lumigent hizo una buena pero dejó de producirla después de que el formato de registro cambia en 2005). Aquí hay una buena discusión sobre esto, incluidos varios enlaces a artículos sobre cómo hacerlo de forma nativa (suponiendo una buena copia de seguridad): http://www.developersdex.com/sql/message.asp?p=580&r=6497847 Quest LiteSpeed ​​tiene una buena copia de seguridad función de inspección, que le permite ver cómo eran los datos en el momento de la copia de seguridad. –

+0

Registro de ApexSQL: http://www.apexsql.com/sql_tools_log.asp ... El registro PI parece que ya no existe ... Quest LiteSpeed: http://www.quest.com/litespeed-for-sql-server/ –

6

Otra opción que quizás desee considerar: Si es posible para el usuario 'deshacer' la operación, es posible que desee implementar una tabla de "intención" donde puede almacenar operaciones pendientes. Una vez que haya realizado su flujo de aplicaciones, el usuario deberá Aceptar o Deshacer la operación, en cuyo momento puede ejecutar la transacción pendiente y aplicarla a su base de datos.

Tenemos un sistema similar en nuestra aplicación web, donde un usuario puede enviar una transacción para su procesamiento y tiene hasta las 5 pm del día en que está programado para ejecutarse para cancelarla. Almacenamos esto en una tabla de intención y procesamos las transacciones programadas para ese día después de la hora de corte diaria. En su caso, necesitaría una operación explícita de 'Aceptar' o 'Deshacer' del usuario después de la 'operación larga' inicial, de modo que cambiaría un poco su proceso.

Espero que esto ayude.

1

No estoy seguro de qué tecnologías está utilizando aquí, pero sin duda hay mejores formas de hacerlo. Puede comenzar almacenando los datos en la sesión y cometiendo cuando se encuentren en la última página. Muchos marcos actualmente también permiten transacciones de larga ejecución que abarcan múltiples solicitudes.

Sin embargo, es probable que desee comprometerse al final de cada página y simplemente establecer algún tipo de bandera para cuando se complete el proceso. De esta forma, si algo sale mal en el medio, el usuario puede recuperarse y no todo está perdido.

Cuestiones relacionadas