Cita:
Empezado por Neftali
Correcto, pero yo estaba pensando en el caso de que le funciona el Begin, pero le falle en Rollback o el Commit. Eso hay que controlarlo, sea con una excepción o preguntarlo antes.
|
La forma correcta de hacerlo es esta, y es universal para cualquier componente de acceso a datos (puede haber errores de sintaxis porque estoy escribiendo de memoria)
Código Delphi
[-]
if not ADOConnection.BeginTransaction then
try
ADOConnection.CommitTransaction;
except
ADOConnection.RollbackTransaction;
raise;
end;
Es importantisimo que la sentencia que inicia la transaccion este fuera del bloque
try, ya que si se pone dentro del
try-except y la transaccion no puede iniciar, y se produce una excepcion por cualquier motivo, el flujo pasa al bloque
except y ejecutariamos un
Rollback cuando no hay ninguna transaccion
Tambien el
Commit suele ser la ultima sentencia del bloque
try, aunque puede haber cosas despues de esto (como escribir en un log). Obviamente tiene que estar despues de realizar todas las inserciones, modificaciones, borrados, o ejecucion de cualquier SQL
Y por ultimo el bloque
except captura todas las excepciones, realiza el
rollback correspondiente (ya que si entramos dentro del try se asegura que estamos en una transaccion) y luego
vuelve a elevar la excepcion (no la oculta), para que se propague