18/08/2005, 13:14
|
| | Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 9 meses Puntos: 6 | |
Muy interesante.
Lo de BEGIN TRANSACTION podría serme útil, ya que precisamente hay una operación en la que hago dos cosas en la base de datos, pero si una de las dos sale mal no quiero que la otra se ejecute.
Ahora mismo, lo que hago es ejecutar una instrucción, comprobar: si está bien, hago la siguiente, si no, no. Compruebo la segunda instrucción, si está bien, todo perfecto, si está mal, deshago la primera instrucción.
He probado a usar el TRANSACTION y me funciona de maravilla, pero podría haber un eventual problemilla:
Yo voy ejecutando instrucciones SQL (no sé si esto estará bien, o debería meterlas todas en una), y hago:
SQL="BEGIN TRANSACTION"
oConn.Execute (SQL)
SQL="mi_instruccion" (es un ejemplo)
oConn.Execute (SQL)
...
Entonces, mi duda es: ¿qué pasaría si justo la última instrucción que debe hacerse (ROLLBACK o COMMIT) no se hace? (que podría ocurrir si, por ejemplo, se va la luz en ese momento) Pues, que tal y como he comprobado (no apagando el ordenador, sino simplemente comenzando una transacción y no finalizándola (lo cual no sé si será equivalente, y si no lo es espero que alguien me lo diga)), la tabla sobre la que se hizo una instrucción queda inutilizada, a la espera de que el sistema reciba una de las dos órdenes (ROLLBACK o COMMIT).
¿Resulta esto seguro? Es decir: si no uso "BEGIN TRANSACTION", con mis "apaños" lo más grave que puede llegar a ocurrir, si algo fallara, es que se quedara una tabla modificada que no se corresponde bien con otra; y esto es fácil de arreglar por una persona que vaya, mire las tablas y borre lo que quiera.
Ahora bien, con COMMIT ya no es lo mismo... se queda "en el aire" y el problema, aunque de fácil solución (ir y ejecutar un "COMMIT"), puede ser más difícilmente detectable.
¿Soluciones ante una eventual pérdida o no ejecución de la instrucción de finalización de la transacción?
Última edición por un_tio; 18/08/2005 a las 13:19 |