Ver Mensaje Individual
  #1  
Antiguo 31-03-2013
jpgonzalez jpgonzalez is offline
Miembro
 
Registrado: feb 2010
Posts: 121
Reputación: 15
jpgonzalez Va por buen camino
Autocommit en ZConnection

Buenas para todos... estuve leyendo varios hilos que hablan de este tema, pero no he podido encontrar la respuesta o solución al problema que estoy teniendo al insertar datos en la BBDD con ZConnection.

Para explicar lo que me esta pasando usaré el ejemplo de las inserciones a varias tablas seguidas:
factura: tabla donde se inserta el encabezado de la factura
facturadetalle: tabla donde se inerta el detalle (los articulos que se facturaron)
pagos: tabla donde se inserta la forma de pago de la factura
articulos: que se utiliza solo para actualizar el stock

Código Delphi [-]
//El codigo esta simplificado al maximo para que no se haga muy larga la parte de codigo, cuando el tema es la conexion

   try
      DmMain.ZConnection.StartTransaction;
         .................................
         QryInsertarFactura.ExecSQL;
         .................................
         QryInsertarDetalleFactura.ExecSQL;
         .................................       
         QryActualizarStock.ExecSQL;
         .................................
         QryInsertarPago.ExecSQL;

      DmMain.ZConnection.Commit;
   except
      DmMain.ZConnection.Rollback;
      ShowMessage('No se ha podido guardar la factura.');
      abort;
   end;

Con este codigo, tenia la propiedad autocommit de ZConnection en true, lo que me generaba un problema de inconsistencia al guardar los datos en la BBDD.
En el ejemplo anterior, primero se inserta la factura, luego el detalle, luego se actualiza el stock y por ultimo se inserta el pago.
Supongamos que la factura, el detalle, y el stock se guarda bien, pero surge un error al guardar el pago.
En teoria, al tener todo en un StartTransaction/Commit no deberia guardar nada, pero al ver la BBDD me encontraba que las tres tablas que no tuvieron error se habian guardado... no se les habia hecho el Rollback a estas tablas.

Buscando en el foro, encontré que habia que poner el autocommit en falso, para que esto no ocurriera.
Poniendo el autocommit en falso, me tiraba otro error: Invalid operation in non AutoCommit mode
Buscando y leyendo encontré que ese error era debido al StartTransaction, ya que ese comando no era necesario cuando el autocommit estaba en falso.

Acto seguido comente esa linea (DmMain.ZConnection.StartTransaction), y solo deje el commit al final de las inserciones, pero cuando hice esto surgio algo nuevo: los datos aparentemente se guardaban, ya que debbugeando el código se ejecutaba todo a la perfección, pero al revisar la BBDD los datos no estaban.
Como si hubiera hecho un commit en memoria, y no lo hubiese posteado en la base.
Seguí buscando y leyendo pero no encontré la razón por la cual pasaba esto... encontre otros hilos que hablaban de commit suaves y commit duros, pero no logré encontrar la respuesta de porque el commit no posteaba en la base.

Mi problema, en resumen es el siguiente:
Si dejo el autocommit en true corro riesgo de generar inconsistencias en los datos de la BBDD, pero si lo pongo en false no puedo lograr que los datos que inserto se posteen en la base.

Espero haber sido claro... abrazo para todos!

Aclaracion; programo en Delphi XE, con ZConnection, MySQL y tablas InnoDB... y la propiedad del ZConnection--> TransactIsolationLevel = tNone
Responder Con Cita