Veo un defecto en el código de
kalimero y es que se "traga" la excepción, por lo que aún cuando se ha realizado correctamente el rollback, pueden haber fallos posteriores debido a esto:
yo lo dejaría como:
Código Delphi
[-]
Conexion.StartTransaction;
try
HacerTodoLoQueSeQuiera;
Conexion.Commit;
except
Conexion.Rollback;
raise; end;
Hasta luego.